标签:
题目
给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。
N = 4
且序列为 [0, 1, 3]
时,缺失的数为2
。
可以改变序列中数的位置。
在数组上原地完成,使用O(1)的额外空间和O(N)的时间。
解题
重新定义一个数组存放排序后的数,空间复杂度和时间复杂度都是O(N)
public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int findMissing(int[] nums) { // write your code here boolean[] A = new boolean[nums.length +1]; for(int i = 0;i<nums.length; i++){ A[nums[i]] = true; } int n = 0; for(int i = 0;i< A.length ;i++){ if(A[i] == false){ n = i; break; } } return n; } }
总耗时: 1674 ms
class Solution: # @param nums: a list of integers # @return: an integer def findMissing(self, nums): # write your code here A = [False]*(len(nums) + 1) for a in nums: A[a] = True for i in range(len(A)): if A[i] == False: return i
总耗时: 276 ms
在下面的挑战中,说可以在原始数组上面操作,如何在原始数组上面操作?空间复杂度并且是O(1)
i^i = 0 一个数自身的异或等于0
这个可以空间复杂可以是O(1),就有下面的代码了
public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int findMissing(int[] nums) { // write your code here int res = 0; for( int i =0;i< nums.length ;i++){ res = res ^ nums[i] ^ i; } res = res^(nums.length); return res; } }
总耗时: 1802 ms
class Solution: # @param nums: a list of integers # @return: an integer def findMissing(self, nums): # write your code here res = 0 for i in range(len(nums)): res = res ^ i ^ nums[i] res ^= len(nums) return res
总耗时: 297 ms
在书影博客中看到通过求和来找缺失的数,我都被这个机智的方法吓到了,竟然如此如此的机智
直接复制其代码:
class Solution(object): def missingNumber(self, nums): """ :type nums: List[int] :rtype: int """ n = len(nums) return n * (n + 1) / 2 - sum(nums)
lintcode 中等题:find the missing number 寻找缺失的数
标签:
原文地址:http://www.cnblogs.com/theskulls/p/4943680.html