zoukankan      html  css  js  c++  java
  • [LeetCode] 268. Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

    Example 1:

    Input: [3,0,1]
    Output: 2
    

    Example 2:

    Input: [9,6,4,2,3,5,7,0,1]
    Output: 8
    

    Note:
    Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

    找到失踪的数字。题意是在一个长度为n的数组里面,存放着从0-n所有的数字,但是少一个。找出这个少了的数字。

    三种思路

    1. 数学方法

    如果数组是完整的,整个数组的和应该是(首项+末项)x 项数 / 2 →设为A

    事实情况的加和设为B,A - B即可得到失去的数字,代码如下

    时间O(n)

    空间O(1)

    JavaScript实现

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var missingNumber = function(nums) {
     6     let res = 0;
     7     let len = nums.length;
     8     let expected = ((1 + len) * len) / 2;
     9     let calculated = 0;
    10     for (let i = 0; i < nums.length; i++) {
    11         calculated += nums[i];
    12     }
    13     res = expected - calculated;
    14     return res;
    15 };

    Java实现

     1 class Solution {
     2     public int missingNumber(int[] nums) {
     3         int n = nums.length;
     4         int total = n * (n + 1) / 2;
     5         int sum = 0;
     6         for (int num : nums) {
     7             sum += num;
     8         }
     9         return total - sum;
    10     }
    11 }

    2. 位运算方法

    因为数组长度是n,数组里面的数字是0-n范围内的,也许我们可以将数组num[i]和他们的下标做一个关联,由此想到了位运算的做法。例子,如果数组是排序好的(没排序也行,因为位运算遵循交换律,此处为解释方便)

    每个数字num[i]和下标i做异或运算XOR,若两者相同,结果为0。根据题意,应该最后就剩下某个数字M= num[i]。M和0再做异或运算,还是M。所以M就是那个失踪的数字。代码如下,

    时间O(n)

    空间O(1)

    JavaScript实现

     1 /**
     2  * @param {number[]} nums
     3  * @return {number}
     4  */
     5 var missingNumber = function(nums) {
     6     let res = nums.length;
     7     for (let i = 0; i < nums.length; i++) {
     8         res ^= i ^ nums[i];
     9     }
    10     return res;
    11 };

    Java实现

    1 class Solution {
    2     public int missingNumber(int[] nums) {
    3         int res = nums.length;
    4         for (int i = 0; i < nums.length; i++) {
    5             res ^= i ^ nums[i];
    6         }
    7         return res;
    8     }
    9 }

    3. 桶排序bucket sort,还是将数字放到它该去的位置上,这样使得数组有序。第二遍扫描的时候就知道哪个数字是缺失的了。

    时间O(n)

    空间O(1)

    Java实现

     1 class Solution {
     2     public int missingNumber(int[] nums) {
     3         for (int i = 0; i < nums.length; i++) {
     4             while (nums[i] >= 0 && nums[i] < nums.length && nums[i] != nums[nums[i]]) {
     5                 int temp = nums[nums[i]];
     6                 nums[nums[i]] = nums[i];
     7                 nums[i] = temp;
     8             }
     9         }
    10 
    11         for (int i = 0; i < nums.length; i++) {
    12             if (nums[i] != i) {
    13                 return i;
    14             }
    15         }
    16         return nums.length;
    17     }
    18 }

    相关题目

    41. First Missing Positive

    268. Missing Number

    442. Find All Duplicates in an Array

    448. Find All Numbers Disappeared in an Array

    LeetCode 题目总结

  • 相关阅读:
    楼宇监控说明
    数字音视频监控系统说明
    图书管理系统详细设计说明
    超邃视频远程监控系统说明
    单点登录系统(SSO)详细设计说明
    视频监控系统的作用何在
    视频监控技术与应用
    HTML--CSS样式表--基本概念(超链接的状态)
    HTML静态网页--框架
    HTML--表格与表单
  • 原文地址:https://www.cnblogs.com/cnoodle/p/11681825.html
Copyright © 2011-2022 走看看