442. Find All Duplicates in an Array

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements that appear twice in this array.

Could you do it without extra space and in O(n) runtime?

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[2,3]
class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList();
        Arrays.sort(nums);
        for(int i = 0; i < nums.length-1; ){
            if(nums[i] == nums[i+1]){
                res.add(nums[i]);
                i+=2;
            }
            else{          
                i++;
            }
        }
        return res;
    }
}

这算O(n)吗??好像不算

public class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        if (nums.length <= 1) return res;
        
        for (int i = 0; i < nums.length; i++) {
            int next = Math.abs(nums[i]) - 1;
            if (nums[next] < 0) res.add(next+1);
            else nums[next] = -nums[next];
        }
        
        return res;
    }
}

这种方法利用了1 ≤ a[i] ≤ n,即a[i]-1一定是nums的index

如果一个数出现两次,第一次出现的时候先把它变成负的,然后第二次出现只要他是负的就res.add()

https://www.cnblogs.com/reboot329/articles/6006346.html

原文地址:https://www.cnblogs.com/wentiliangkaihua/p/12886816.html