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

在这里插入图片描述
这道题要解答还是很简单的,直接hash,但是要让空间复杂度为O(1),忽略返回的List的大小,还是稍微动一下脑筋的。
具体思路就是:

  1. 将原始数组作为hash的结构,就不用新开空间了。
  2. 遍历数组,由于数组中数字的范围是1~n,与数组中每个元素下标可以一一对应。
  3. 将遍历到的数组的数字减一与n求余,范围就是0~n-1,然后将该数字作为数组下标,将下标对应的数字加n
  4. 最后重新遍历数组,小于等于n的数字的下标就是没出现过的数字
    在这里插入图片描述
    代码如下
import java.util.ArrayList;
import java.util.List;

public class test2 {
    public static void main(String[] args){
        int[] nums = {4,3,2,7,8,2,3,1};
        findDisappearedNumbers(nums);
    }
    public static List<Integer> findDisappearedNumbers(int[] nums) {
        int n = nums.length;
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < n; i++){
            int temp = (nums[i]-1) % n;
            nums[temp] += n;
        }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值