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

题目

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

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

输出:
[5,6]

思路

题目要求不要使用额外空间
数组中的数字取值是在 1 ≤ a[i] ≤ n
也就是说每个数字nums[i]都对应着一个索引 i - 1
只要根据索引对于对应位置上的数字进行处理
让他取负值即可
最后操作完遍历
还是正值的就说明 缺少数字对索引上的数字进行变化

需要注意的是
因为有重复数组
所以去两次负值 会让他重新变为正值
所以我们在取负值之前
要做一下判断
如果是正值的话
再取负值
以此消去同一值多次出现的影响

import java.util.*;
class Solution {
     
    public List<Integer> findDisappearedNumbers(int[] nums) {
     
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < nums.length; i++){
     
            int index = Math.abs(nums[i]) - 1;
            if(nums[index] > 0){
     
                nums[index] *= -1;
            }
        }
        for(int i = 1; i <= nums.length; i++){
     
            if(nums[i-1] > 0){
     
                list.add(i);
            }
        }
        return list;


    }
}

你可能感兴趣的:(LeetCode)