leetcode448. Find All Numbers Disappeared in an Array

image.png

找到数组中缺失的元素,简单一点的方法使用个set过一遍数组然后找到没有元素即可,但是题目要求空间复杂度O(1),该方法技巧性有点强:
因为题目说数组中的数都是1-n范围内的,因此对应的索引为0-n-1,所以对于数组[4, 3, 2, 7, 8, 2, 3, 1],将各元素值减去1即可得到对应的索引数组[3, 2, 1, 6, 7, 1, 2, 0],将对应索引位置的元素取反,因为有重复元素,所以当某个位置的元素已经是负数了就不操作,所以最后肯定会有一些位置的元素不是负数,那么这些位置的索引值+1就是缺少的元素。

上述取反后的数组为[-4, -3, -2, -7, 8, 2, -3, -1],因此缺少的就是5和6.

这么做为什么是对的呢?因为将各元素-1后对应的索引本身就是对原数组中元素的使用,如果操作结束后的数组相应索引位置依然为正数,那么就代表原数组中没有该索引值+1的数。

public List findDisappearedNumbers(int[] nums) {
        List res = new ArrayList<>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            int value = Math.abs(nums[i]) - 1;
            if (nums[value] > 0) {
                nums[value] = -nums[value];
            }
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) res.add(i + 1);
        }
        return res;
    }

你可能感兴趣的:(leetcode448. Find All Numbers Disappeared in an Array)