278、找到所有数组中消失的数字

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

  

示例 1

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

输出:[5,6]

示例 2

输入:nums = [1,1]

输出:[2]

  

提示:

n == nums.length

1 <= n <= 105

1 <= nums[i] <= n

进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.number;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

/**

 * 448. 找到所有数组中消失的数字<br/>

 * 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。 <br/>

 * 请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。<br/>

 *

 * 来源:力扣(LeetCode) 链接:力扣

 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-2-19

 */

public class FindAllNumbersDisappearedInAnArray {

    /* 示例 1:

     

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

    输出:[5,6]

    示例 2:

     

    输入:nums = [1,1]

    输出:[2]

      

     

    提示:

     

    n == nums.length

    1 <= n <= 105

    1 <= nums[i] <= n

    进阶:你能在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题吗?

    你可以假定返回的数组不算在额外空间内。

    */

    /**

     * 同MissingNumber这个算一类问题;不使用额外空间,但用了“返回数组”这个额外的空间; <br/>

     * 疑问,能做到在原数组nums里修改就搞定吗?<br/>

     * nums[4-1]=1

     * 弊端:ArrayList,LinkedList,数据量很大时,超时了

     *

     * @param nums

     * @return

     */

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

        //List<Integer> existList = new ArrayList<>(nums.length);

        //用Set,16ms;用ArrayList和LinkedList超时了

        Set<Integer> existList = new HashSet<>();

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

             existList.add(nums[index]);

        }

        // 0表示有值,0不会和nums中的数字冲突

        for (int num : existList) {

            nums[num - 1] = 0;

        }

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

        // 非0,表示没有值

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

            if (nums[index] != 0) {

                notExistList.add(index + 1);

            }

        }

        return notExistList;

    }

    /**

     * 需要额外的空间numsExist,代码更清晰(用时3ms)

     *

     * @param nums

     * @return

     */

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

        int[] numsExist = new int[nums.length];

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

            final int num = nums[index];

            numsExist[num - 1] = 1;

        }

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

        for (int index = 0; index < numsExist.length; index++) {

            if (numsExist[index] == 0) {

                notExistList.add(index + 1);

            }

        }

        return notExistList;

    }

}

package test.leecode.isNumber;

import java.util.List;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.number.FindAllNumbersDisappearedInAnArray;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-22

 */

public class FindAllNumbersDisappearedInAnArrayTest {

     

    @Test

    public void test() {

        FindAllNumbersDisappearedInAnArray mn = new FindAllNumbersDisappearedInAnArray();

        int[] nums2=new int[] {1,1};

        int[] nums5=new int[] {1,3,4,2,2};

        int[] nums11=new int[] {10,9,8,2,5,6,4,3,3,7,9};

        Assert.assertEquals((Object)2,mn.findDisappearedNumbers(nums2).get(0));

        Assert.assertEquals((Object)5,mn.findDisappearedNumbers(nums5).get(0));

        final List<Integer> numList = mn.findDisappearedNumbers(nums11);

        final Object actual1 = numList.get(0);

        final Object actual11 = numList.get(1);

        Assert.assertEquals(1,actual1);

        Assert.assertEquals(11,actual11);

    }

     

    @Test

    public void testSet() {

        FindAllNumbersDisappearedInAnArray mn = new FindAllNumbersDisappearedInAnArray();

        int[] nums2=new int[] {1,1};

        int[] nums5=new int[] {1,3,4,2,2};

        int[] nums11=new int[] {10,9,8,2,5,6,4,3,3,7,9};

        Assert.assertEquals((Object)2,mn.findDisappearedNumberSet(nums2).get(0));

        Assert.assertEquals((Object)5,mn.findDisappearedNumberSet(nums5).get(0));

        final List<Integer> numList = mn.findDisappearedNumberSet(nums11);

        final Object actual1 = numList.get(0);

        final Object actual11 = numList.get(1);

        Assert.assertEquals(1,actual1);

        Assert.assertEquals(11,actual11);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值