LeetCode0268.缺失數字
阿新 • • 發佈:2018-12-14
268缺失數字-陣列
描述
給定一個包含 0, 1, 2, ..., n
中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。
例項
輸入: [3,0,1]
輸出: 2
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8
說明
你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?
題解
本題最簡單的思路就是直接把所有已有的元素都放到一個地方,再一一檢查.下面是我的程式碼
static public int missingNumber(int[] nums) {
HashSet<Integer> hashSet = new HashSet< >();
for (int i = 0; i < nums.length; i++) {
hashSet.add(nums[i]);
}
for (int i = 0; i <= nums.length; i++) {
if (hashSet.add(i)){
return i;
}
}
return 0;
}
不過使用到了HashSet,速度不夠快,如果使用陣列更好.
class Solution {
public int missingNumber(int [] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
int[] newNums = new int[length + 1];
for(int num : nums) {
newNums[num] = 1;
}
for(int i = 0; i < newNums.length; i++) {
if(newNums[i] == 0) {
return i;
}
}
return 0;
}
}
上述兩個程式碼都滿足了O(n)
的時間複雜度,但是對於常數級別的額外空間沒有滿足.有一種解法是將上述所有元素求和,再與sum(0~n)
進行比較,差值就是缺少的數值…效率又高,空間又省…
int missingNumber(vector<int>& nums) {
int sum = 0, n = nums.size();
for (auto &a : nums) {
sum += a;
}
return 0.5 * n * (n + 1) - sum;
}
第一第二種是常規做法,第三種不強求,但需要有這樣的比較意識.