1. 程式人生 > >leetcode (Missing Number)

leetcode (Missing Number)

Title:Missing Number   268

Difficulty:Easy

原題leetcode地址:https://leetcode.com/problems/missing-number/

 

1. 申請了額外的空間,在新申請的空間中將nums重新排序,然後找到當前位置上的數與位置的值不同(類似於排序)

時間複雜度:O(n),兩次for迴圈,但都是一層,遍歷整個陣列的長度。

空間複雜度:O(n),申請一個n長度的陣列。

    /**
     * 申請了額外的空間,在新申請的空間中將nums重新排序,然後找到當前位置上的數與位置的值不同
     * @param nums
     * @return
     */
    public static int missingNumber(int[] nums) {

        if (nums == null || nums.length <= 0) {
            return 0;
        }

        int n[] = new int[nums.length + 1];

        for (int i = 0; i < nums.length; i++) {
            n[nums[i]] = nums[i];
        }

        int flag = 0;
        for (int i = 1; i < n.length; i++) {
            if (n[i] == 0) {
                flag = i;
            }
        }

        return flag;

    }

2. 先計算0~n的和,再計算nums中數的和,最後相減就是結果

時間複雜度:O(n),一次一層for迴圈,遍歷整個陣列的長度。

空間複雜度:O(1),沒有申請額外的空間。

    /**
     * 將0~n想加求和S1,再將nums中的想加求和S2,S1-S2就是最後的結果
     * @param nums
     * @return
     */
    public static int missingNumber1(int[] nums) {

        if (nums == null || nums.length <= 0) {
            return 0;
        }

        int result = nums.length;
        for (int i = 0; i < nums.length; i++) {
            result += i - nums[i];
        }

        return result;
    }