1. 程式人生 > >Leetcode_448 找到所有陣列中消失的數字

Leetcode_448 找到所有陣列中消失的數字

題目: 給定一個範圍在 1 ≤ a[i] ≤ n ( n = 陣列大小 ) 的 整型陣列,陣列中的元素一些出現了兩次,另一些只出現一次。

找到所有在 [1, n] 範圍之間沒有出現在陣列中的數字。

您能在不使用額外空間且時間複雜度為O(n)的情況下完成這個任務嗎? 你可以假定返回的陣列不算在額外空間內。

示例:

輸入: [4,3,2,7,8,2,3,1]

思路一: 開闢一個長度為n的空陣列temp,全部初始化為0,遍歷nums陣列,將出現的數字在temp中做標記,然後遍歷temp,即可得到哪些數字出現沒有出現。 雖然時間複雜度為O(n),但空間複雜度為O(n)。

思路二: 將nums中數字進行排序,然後遍歷。 雖然空間複雜度為O(1),但時間複雜度最少為O(nlgn)。

思路三: 因為nums中所有的數字都大於0,並且所有的數字都在[1,n],並且陣列的長度為n,所以可以通過將正數變負數作為打標記記號,這樣就不用單獨開闢新的空間,而且原來的數值資訊可以通過取絕對值復現,哇,棒棒的! 第一遍遍歷nums,可以將對應位置的數值變為負數,標記這個數字在nums中出現過。第二遍將nums中大於0的值的位置的數字加入result中,返回。 具體程式碼如下:

import java.util.ArrayList;
import java.util.List;

public class Leetcode_448 {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        int length = nums.length;
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < length; i++) {
            int index = Math.abs(nums[i]) - 1;
            nums[index] = (nums[index] > 0) ? -nums[index] : nums[index];
        }
        for (int i = 0; i < length; i++) {
            if (nums[i] >0) {
                result.add(i+1);
            }
        }
        return result;
    }
}