Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
给定一个包含n个不同的数字的数组,找到这个数组中从0到n缺少的数
这里需要解释一下n个数的数组只能装下n-1个数!即三个数的组数[3,1,2],其缺少的数字是0。
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?
Solutions:
Python
(1)
class Solution:
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums)
newnums = list(range(length+1)) #创建一个包含n+1个排好序的列表
numssort = sorted(nums) #将原数组排序
for i in range(len(nums)): #对比排好序的原数组和创建好的n+1数组
if newnums[i] != numssort[i]: #如果两个数不相同,那么说明少了newnums[i]这个数
return newnums[i]
return newnums[length] #如果遍历完nums之后,说明少了最大的第n个数,所以返回newnums[length]
(2)
class Solution:
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#这个方法更加简单,先求n个数的加和,再求原数组的加和,两者差值即为缺少的元素
n = len(nums)
expected_sum = n*(n+1)/2
actual_sum = sum(nums)
return expected_sum-actual_sum
C++
#include <numeric> //调用加和函数accumulate需要用到函数库numeric
class Solution {
public:
int missingNumber(vector<int>& nums) {
int length = nums.size();
int exp = length*(length+1)/2; //必定整除,因为length和length+1必定一个奇数一个偶数
int sum = accumulate(nums.begin(),nums.end(),0); //accumulate带有三个形参:前两个形参指定要累加的元素范围,第三个形参则是累加的初值。
return exp-sum;
}
};