1. 程式人生 > >LeetCode-Single Element in a Sorted Array

LeetCode-Single Element in a Sorted Array

一、Description

題目描述:在一個有序陣列中找出只出現一次的數字,要求時間複雜度為O(log n) 。

Example 1:

Input: [1,1,2,3,3,4,4,8,8]
Output: 2

Example 2:

Input: [3,3,7,7,10,11,11]
Output: 10

二、Analyzation

方法一:

如果沒有時間複雜度的要求,可以考慮用異或的思路,所有出現兩次的數字通過異或相互抵消,剩下的數字就是隻出現一次的。

見code1。

方法二:

二分法:令index為Single Element在陣列中的位置。l = 0,h = nums.length - 1,m = l + (h - l) / 2。通過觀察我們可以發現,如果m為偶數,並且nums[m] == nums[m + 1],那麼index所在的位置為[m + 2, h],此時令 l = m + 2;如果 nums[m] != nums[m + 1],那麼 index 所在的陣列位置為 [l, m],此時令 h = m。

因為 h 的賦值表示式為 h = m,那麼迴圈條件也就只能使用 l < h 這種形式。

見code2。


三、Accepted code

code1:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        if (null == nums || 0 == nums.length) {
            return -1;
        }
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }
        return result;
    }
}

code2:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        if (null == nums || 0 == nums.length) {
            return -1;
        }
        int l = 0, h = nums.length - 1;
        while (l < h) {
            int m = l + (h - l) / 2;
            if (m % 2 == 1) {
                m--;
            }
            if (nums[m] == nums[m + 1]) {
                l = m + 2;
            } else {
                h = m;
            }
        }
        return nums[l];
    }
}