1 題目描述
給定一個範圍在 1 ≤ a[i] ≤ n ( n = 數組大小 ) 的 整型數組,數組中的元素一些出現了兩次,另一些只出現一次。
找到所有在 [1, n] 範圍之間沒有出現在數組中的數字。
您能在不使用額外空間且時間複雜度爲O(n)的情況下完成這個任務嗎? 你可以假定返回的數組不算在額外空間內。
示例:
輸入:
[4,3,2,7,8,2,3,1]
輸出:
[5,6]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法一:排序後後一個減去前一個 判斷它們之間的差值
如果數組是有序的,那麼就很容易知道缺失的數字是哪個了。
首先我們對數組進行排序,隨後我們可以在常數時間內判斷兩種特殊情況:0 沒有出現在數組的首位,以及 n 沒有出現在數組的末位。如果這兩種特殊情況都不滿足,那麼缺失的數字一定在 0 和 n 之間(不包括兩者)。此時我們可以在線性時間內掃描這個數組,如果某一個數比它前面的那個數大了超過 1,那麼這兩個數之間的那個數即爲缺失的數字。
- 方法二: 排序後判斷對應位置上的數是否相等
相等的話就是正確的,不相等的話就是確實不相等位置上的數
3 解決代碼
- 方法一
class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
//判斷0 是否在首位
if(nums[0] != 0){
return 0;
}
//判斷n是否在末位
else if(nums[nums.length - 1] != nums.length){
return nums.length;
}
// 此時缺失的數字一定在 (0, n) 中
for(int i = 1; i < nums.length ;i++){
int exceptedNum = nums[i-1]+1;
if (nums[i] != exceptedNum)
return exceptedNum;
}
// 未缺失任何數字(保證函數有返回值)
return -1;
}
}
- 方法二
class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i <nums.length;i++){
if(nums[i] != i)
return i;
}
return nums.length;
}
}