448. 找到所有数组中消失的数字(高频题)


448. 找到所有数组中消失的数字

解题思路

将所有正数作为数组下标,置对应数组值为负值。那么,仍为正数的位置即为(未出现过)消失的数字。

举个例子:

  • 原始数组:[4,3,2,7,8,2,3,1]

  • 重置后为:[-4,-3,-2,-7,8,2,-3,-1]

结论:[8,2] 分别对应的index+1后为[5,6](消失的数字)

在这里插入图片描述

代码

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> list = new ArrayList<>();
        //将所有正数作为数组下标,置对应数组下标元素的值为负值。
        //最后仍为正数的位置即为(未出现过)消失的数字。
        for (int i = 0; i < nums.length; i++) {
            //由于有的数字是重复的,所以当该数字已经被置为负数时则nums[Math.abs(nums[i]) - 1] < 0不再处理
            if (nums[Math.abs(nums[i]) - 1] > 0) {
                nums[Math.abs(nums[i]) - 1] = -nums[Math.abs(nums[i]) - 1];
            }
        }
        //将仍为正数的索引+1记录下来
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) list.add(i + 1);
        }
        return list;
    }
}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录