[LeetCode] 448. 找到所有數組中消失的數字

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章