首页 > 代码库 > Leetcode分类刷题答案&心得

Leetcode分类刷题答案&心得

Array

448.找出数组中所有消失的数

要求:整型数组取值为 1 ≤ a[i] ≤ n,n是数组大小,一些元素重复出现,找出[1,n]中没出现的数,实现时时间复杂度为O(n),并不占额外空间。

思路1:(discuss)用数组下标标记未出现的数,如出现4就把a[3]的数变成负数,当查找时判断a的正负就能获取下标。

tips:注意数组溢出。

技术分享
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> disList = new ArrayList<Integer>();
        
        //用数组下标来记录出现过的数
        for (int i = 0; i < nums.length; i++) {
            int item = Math.abs(nums[i]) - 1;
            //判断是否已经出现过
            if (nums[item] > 0) {
                nums[item] = -nums[item];
            }
        }
        
        //把仍然是正数所对应的下标加入数组列表中
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                disList.add(i + 1);
            }
        }
        return disList;
    }
View Code

思路2:(discuss)下标标记数,但把出现过的数用作下标,然后此下标对应的数+n

技术分享
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> disList = new ArrayList<Integer>();
        int n = nums.length;
        //用数组下标来记录出现过的数
        for (int i = 0; i < nums.length; i++) {
            nums[(nums[i] - 1) % n] += n;
        }
        
        //把a[i]小于n时的i+1加入数组列表中
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] <= n) {
                disList.add(i + 1);
            }
        }
        return disList;
    }
View Code

思路3:(discuss)整理数组,目的就是把数字与下标对应,整理后下标与数字不对应就证明此数消失。

技术分享
    public List<Integer> findDisappearedNumbers(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) {
                int tmp = nums[i];
                nums[i] = nums[tmp - 1];
                nums[tmp - 1] = tmp;
            }
        }
        List<Integer> res = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != i + 1) {
                res.add(i + 1);
            }
        }
        return res;
    }
View Code

 2016-12-14

Leetcode分类刷题答案&心得