306、丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

  

示例 1

输入:nums = [3,0,1]

输出:2

解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2

输入:nums = [0,1]

输出:2

解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3

输入:nums = [9,6,4,2,3,5,7,0,1]

输出:8

解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4

输入:nums = [0]

输出:1

解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

  

提示:

n == nums.length

1 <= n <= 104

0 <= nums[i] <= n

nums 中的所有数字都 独一无二

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/missing-number

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

package cn.fansunion.leecode.number;

import java.util.Arrays;

/**

 * 268. 丢失的数字(这道题的解法非常多) <br/>

 * 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-2-19

 */

public class MissingNumber {

    /* 示例 1:

     

    输入:nums = [3,0,1]

    输出:2

    解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

    示例 2:

     

    输入:nums = [0,1]

    输出:2

    解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

    示例 3:

     

    输入:nums = [9,6,4,2,3,5,7,0,1]

    输出:8

    解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

    示例 4:

     

    输入:nums = [0]

    输出:1

    解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

      

     

    提示:

     

    n == nums.length

    1 <= n <= 104

    0 <= nums[i] <= n

    nums 中的所有数字都 独一无二

      

     

    进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?*/

    /**

     * 题目特点:数字连续出现;使用数组中出现的数字作为索引,值:是否出现过

     *

     * @param nums

     * @return

     */

    public int missingNumber(int[] nums) {

        //类似:Set<Integer> set = new HashSet<Integer>();

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

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

            final int num = nums[index];

            numsExist[num] = 1;

        }

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

            if (numsExist[index] == 0) {

                return index;

            }

        }

        return -1;

    }

    /**

     * 先排序,再遍历查找不存在的;如果都存在,不存在的数字就是第n个数(数组的长度)

     *

     * @param nums

     * @return

     */

    public int missingNumber2(int[] nums) {

        Arrays.sort(nums);

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

            if (index != nums[index]) {

                return index;

            }

        }

        // 第n个数,最大的数漏了

        return nums.length;

    }

}

package test.leecode.number;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.number.MissingNumber;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-19

 */

public class MissingNumberTest {

    @Test

    public void test() {

        MissingNumber mn = new MissingNumber();

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

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

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

        Assert.assertEquals(2,mn.missingNumber2(nums2));

        Assert.assertEquals(5,mn.missingNumber2(nums5));

        Assert.assertEquals(11,mn.missingNumber2(nums11));

        //更优解法

        Assert.assertEquals(2,mn.missingNumber(nums2));

        Assert.assertEquals(5,mn.missingNumber(nums5));

        Assert.assertEquals(11,mn.missingNumber(nums11));

    }

}

上一篇:微信小程序---自定义tabbar


下一篇:ES数据迁移,添加索引字段,索引备份