LeetCode演算法入門 缺失數字 解法與分析

2021-09-27 06:37:05 字數 1497 閱讀 8945

給定乙個包含0, 1, 2, ..., n中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。

示例 1:

輸入: [3,0,1]

輸出: 2

示例 2:

輸入: [9,6,4,2,3,5,7,0,1]

輸出: 8

說明:

你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?

用排序,然後找哪個數字不在。

思路:此題只需要採用位運算,每次將原來的數字向左移動1位,就需要把該末尾加到我們的數字中去即可,此題需要注意的是一點要迴圈32次,不僅是有32位,最重要的不能判斷到原來的數字為0就結束迴圈,這樣就有可能的導致沒有補足0所以要迴圈32次。

同時對於左移而言,末尾全部補上的是0,而對於右移而言左邊補的是原本最高位的數字,比如乙個32位的數字最高位(也就是符號位)為1就全部補上1,如果為0 就全部補上0.這個知識點也是面試常考的。

時間複雜度是o(nlogn).

雜湊表。遍歷陣列,每個數是否出現一次。

但是空間複雜度是o(n).

數學方法,0~n的和可以用高斯公式n(n+1)/2,所以減一下就知道是缺少哪個數字了。

**如下:

class

solution

return sum - sum_now;}}

;

看力扣官方的解法,沒太看懂。

分析由於異或運算(xor)滿足結合律,並且對乙個數進行兩次完全相同的異或運算會得到原來的數,因此我們可以通過異或運算找到缺失的數字。

演算法我們知道陣列中有 nn 個數,並且缺失的數在 [0…n][0…n] 中。因此我們可以先得到 [0…n][0…n] 的異或值,再將結果對陣列中的每乙個數進行一次異或運算。未缺失的數在 [0…n][0…n] 和陣列中各出現一次,因此異或後得到 0。而缺失的數字只在 [0…n][0…n] **現了一次,在陣列中沒有出現,因此最終的異或結果即為這個缺失的數字。

在編寫**時,由於 [0…n][0…n] 恰好是這個陣列的下標加上 nn,因此可以用一次迴圈完成所有的異或運算,例如下面這個例子:

下標 0 1 2 3

數字 0 1 3 4

可以將結果的初始值設為 nn,再對陣列中的每乙個數以及它的下標進行乙個異或運算,即:下標0

123數字

0134

​ 可以將結果的初始值設為 n,再對陣列中的每乙個數以及它的下標進行乙個異或運算,即:

missing =4∧(0∧0)∧(1∧1)∧(2∧3)∧(3∧4)

=(4∧4)∧(0∧0)∧(1∧1)∧(3∧3)∧2

=0∧0∧0∧0∧2

=2**如下:

class

solution

return missing;}}

;

leetcode演算法 回文數

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10 輸出 false 解釋 從右向左...

異或運用 演算法題 缺失的數

題目 給出乙個包含 0 n 中 n 個數的序列,找出0 n 中沒有出現在序列中的那個數。public int findmissing int nums int result total 0 int result incomplete 0 for int i 0 i nums.length i for...

LeetCode演算法41 java缺失的第乙個正數

問題 給定乙個未排序的整數陣列,找出其中沒有出現的最小的正整數。示例 1 輸入 1,2,0 輸出 3 示例 2 輸入 3,4,1,1 輸出 2 示例 3 輸入 7,8,9,11,12 輸出 1 說明 你的演算法的時間複雜度應為o n 並且只能使用常數級別的空間。思考 有的小夥伴上來說這個題太簡單了,...