448. Find All Numbers Disappeared in an Array

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

Find all the elements of [1, n] inclusive that do not appear in this
array.

Could you do it without extra space and in O(n) runtime? You may
assume the returned list does not count as extra space.

Example:
    Input:
    [4,3,2,7,8,2,3,1]
    Output:
    [5,6]

题目描述:给一个数组,元素的值大于等于1 小于等于n ,有一些元素出现了两次,请找出没有出现在1~n之间的元素。

思路:这道题与 287. Find the Duplicate Number 442. Find All Duplicates in an Array 的思路都是一样的,都是采用的负数标记的方法
因为题中给出了一个很重要的条件,那就是 1<= a[i] <= n,所以说方法就是将每个元素在 1~n 中的位置标记出来,比如4 在1~n 中的位置就是4 所以将a[3] 中的元素取负数
以此类推,通过判断是否为负数来看是否标记过,最终在数组中出现的元素对应1~n 的位置都已经标记出来,通过查找正数的元素也就是数组元素在1~n中没有出现的数

例如:4,3,2,7,8,2,3,1
标记:-4,-3,-2,-7,-8,2,3,-1

其中重复的是2和3 那么它们所占用的是5和6的位置,所以将下标+1就得到缺失的元素

 public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> ret = new ArrayList<Integer>();

        for(int i = 0; i < nums.length; i++) {
            int val = Math.abs(nums[i]) - 1;
            if(nums[val] > 0) {
                nums[val] = -nums[val];
            }
        }

        for(int i = 0; i < nums.length; i++) {
            if(nums[i] > 0) {
                ret.add(i+1);
            }
        }
        return ret;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值