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

Posted huoyingfans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

    

以上是关于278找到所有数组中消失的数字的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

算法15-----找到所有数组中消失的数字