JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-06-15
目录

数组中重复的数据Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]

示例 2:

输入:nums = [1,1,2]
输出:[1]

示例 3:

输入:nums = [1]
输出:[]

提示:

  • n == nums.length
  • 1 <= n <= 105
  • 1 <= nums[i] <= n
  • nums 中的每个元素出现 一次 或 两次

# 思路

/**
 * 这个题属于技巧题 首先仔细看输入的给定的数组值 该值的区间为 1 ≤ a[i] ≤ n
 * 这其实是这道题解题的关键点,好好利用这个信息。 某些元素出现了两次,
 * 而一些其他的元素只出现了1次,我们可以利用这些元素在出现次数上面的不一样做文章。
 *
 * 仔细观察发现1 ≤ a[i] ≤ n 这个条件,正好和我们数组的下标差1,我们可以按照数值
 * 来遍历数组,那么在数组中具有相同值的元素,会被经过两次,那么我们只要想出一种方式
 * 在这个遍历结束后可以区分,哪些元素被经过了多次即可,由于数组元素具有1 ≤ a[i] ≤ n
 * 这样的范围,那其实我们当每次经过一个元素时,给他加上n,当遍历结束时,我们再次遍历数组
 * 那些数值超过2n的元素索引+1,对应的就是我们的出现了两次的元素。
 * @param nums
 * @return
 */

# 解法


class Solution {
     /**
     * 这个题属于技巧题 首先仔细看输入的给定的数组值 该值的区间为 1 ≤ a[i] ≤ n
     * 这其实是这道题解题的关键点,好好利用这个信息。 某些元素出现了两次,
     * 而一些其他的元素只出现了1次,我们可以利用这些元素在出现次数上面的不一样做文章。
     *
     * 仔细观察发现1 ≤ a[i] ≤ n 这个条件,正好和我们数组的下标差1,我们可以按照数值
     * 来遍历数组,那么在数组中具有相同值的元素,会被经过两次,那么我们只要想出一种方式
     * 在这个遍历结束后可以区分,哪些元素被经过了多次即可,由于数组元素具有1 ≤ a[i] ≤ n
     * 这样的范围,那其实我们当每次经过一个元素时,给他加上n,当遍历结束时,我们再次遍历数组
     * 那些数值超过2n的元素索引+1,对应的就是我们的出现了两次的元素。
     * @param nums
     * @return
     */
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> ret = new ArrayList<>();

        int n = nums.length;
        for(int i = 0; i < n; i++){
            nums[(nums[i] - 1) % n] += n;
        }

        for(int i = 0; i < n; i++){
            if(nums[i] > 2 * n) ret.add(i+1);
        }
        return ret;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式