Leetcode 448. Find All Numbers Disappeared in an Array 找没有的数 解题报告

1 解题思想

这道题会给一个长度为n的数组,这个数组里面包含1-n的数字,数字的分布并不均匀,数字可以出现0-n次

所以这个数组中可能并不完全包含1-n中的所有数字,现在需要你在常数时间和不用额外空间的情况下找出那些数字没有出现过

解题思想是,遍历两轮:
1、第一轮将每个数字对应的那个位置的数字变成负值(因为所有数都是正的,这么做不影响后续)
2、第二轮,统计那些没有变成负值的,这些就是没有出现过的数

2 原题

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]

3 AC解

public class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> res = new ArrayList<Integer>();
        int n = nums.length;
        //第一轮,将所有出现过的值对应的位置变为负数
        for(int i=0;i<n;i++){
            int index = Math.abs(nums[i]) - 1;
            nums[index] = Math.abs(nums[index]) * -1;
        }
        //第二轮,统计不为负数的(就是没出现过的)
        for(int i=0;i<n;i++){
            if(nums[i] > 0)
                res.add(i+1);
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值