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

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

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

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

示例:

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

输出:
[5,6]

思路:

归位法,将各数字放于他应有的次序,之后遍历数组,每个位置上的数字与原本应有的数字不对应,即数字i+1不存在

例如:2 3  5  1  2

第一次遍历:2应该放在第二个位置,-> 3 2 5 1 2

还在i=0位置处,发现3也不在应该的位置  -> 5  2  3  1  2

哎?5也不在   ->2  2  3  1  5

虽然第一个2不应该放在i=0处,但i=1处已经有2,所以不交换,进行第二次遍历

第二次遍历:第二个2已经归位

第三次遍历:3已经归位

第四次遍历:1不在本来的位置  ->1  2  3  2  5

第五次遍历:5已经归位

之后遍历数组,发现i=3处本来应该是4,现在没有,4就是消失的数字

提交的代码:

class Solution {

    public List<Integer> findDisappearedNumbers(int[] nums) {

        List<Integer> list = new ArrayList<Integer>();

            for(int i=0;i<nums.length;i++)

            {

                while(nums[i]!=nums[nums[i]-1])  //不可写为if,因为交换之后,i处可能还不是本来应该有的数字,具体看上面的例子

                {

                    int t = nums[nums[i]-1];

                    nums[nums[i]-1] = nums[i];

                    nums[i] = t;

                }

            }

            for(int i=0;i<nums.length;i++)

            {

                if(nums[i]!=(i+1))

                {

                    list.add(i+1);

                }

            }

            return list;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值