LeetCode 第448题:找到所有数组中消失的数字

2021-06-12  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

如果使用桶排序的思路,那么避免不了使用 O(n) 的额外空间,虽然时间复杂度是 O(n)。

题目要求不使用额外空间,那么只能在原数组上做改动。由题目可知,数组中的每个数其实就相当于一个 index,我们改变 (index - 1) % nums.length 下标的数,将它加上 nums.length。后续再遍历原数组,如果数组中的数字小于等于 nums.length,那么说明该下标在数组中不存在,加入 list 即可。

3、代码

public class Q448_FindDisappearedNumbers {

    public List<Integer> findDisappearedNumbers(int[] nums) {
        if(nums == null || nums.length == 0){
            return new ArrayList<>();
        }

        int[] res = new int[nums.length + 1];
        for(int i = 0; i < nums.length; i++){
            int index = nums[i];
            res[index]++;
        }

        List<Integer> list = new ArrayList<>();
        for (int i = 1; i < res.length; i++) {
            if(res[i] == 0){
                list.add(res[i]);
            }
        }

        return list;
    }

    public List<Integer> findDisappearedNumbers2(int[] nums) {
        if(nums == null || nums.length == 0){
            return new ArrayList<>();
        }

        for (int i = 0; i < nums.length; i++) {
            int index = (nums[i] - 1) % nums.length;
            nums[index] = nums[index] + nums.length;
        }

        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] <= nums.length){
                list.add(i + 1);
            }
        }

        return list;
    }

    public static void main(String[] args) {
        new Q448_FindDisappearedNumbers().findDisappearedNumbers2(new int[]{4,3,2,7,8,2,3,1});
    }
}

上一篇 下一篇

猜你喜欢

热点阅读