2020年5月12日 星期二

Leetcode題解 Python & C#:五月挑戰DAY12 Single Element in a Sorted Array


給一個經排序後的數列,找出其中只出現一次的元素。(其他重複二次)

被限制在 時間複雜度 O(log n) 和 空間複雜度 O(1),解決。

說到 O(log n) time ,經典的方式是二分法。

由於其他都出現二次,可想 pos % 2 == 0 的位置會等於其右方的,除非有出現單次的元素在左方。

用二分搜尋法,計算的 m 在比較的時候要用 % 2 修正位置,去讓奇數位比其右方的位罝。

這裡的 r 跟往不同減了 1 ,是因應「超界」做處理,如果出現單次的在最右方,那麼一般的二分搜尋法,會在比較時比 nums[n] 。如果左方都出現兩次,那最後 r 值不變,指向最後一個為單一的元素。

Python
class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:        
        l, r = 0, len(nums)-1
        while l < r:
            m = (r-l)//2 + l
            if nums[m-m%2] == nums[m+1-m%2]:
                l = m+1
            else:
                r = m
        return nums[r]
C#
public class Solution {
    public int SingleNonDuplicate(int[] nums) {
        int l = 0; int r = nums.Length-1;
        while(l < r)
        {
            int m = (r-l)/2 + l;
            if(nums[m - m%2] == nums[m - m%2 + 1])
            {
                l = m + 1;
            }
            else
            {
                r = m;
            }
        }
        return nums[r];
    }
}