標籤:this span 個數 cep bsp duplicate dup public color
Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.
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
Note: Your solution should run in O(log n) time and O(1) space.
題意:給一個排好序的數組,其中只有一個數字出現了1次,其餘都出現了2次
二分的思想,這次判斷的是奇偶,舉個例子:
1) 1 1 2 3 3 4 4 8 8
二分先找中間,我們指向了nums[4] = =3 的位置,判斷它的左右,找到第一個相同的數,什麼意思呢,
我們假設現在數組是這樣的
2)1 1 2 2 3 4 4 8 8 3的左和右都和它不等,那麼3是我們要找的
假設數組現在是這樣的
3)1 1 2 2 3 3 4 8 8 同1中做一下比較,1中第一個3的位置是3,從這個點起,左右兩邊(左邊包括這個位置)哪邊是奇數,那麼那個只有1次的數字就在那邊
這裡注意一下,最左邊和最右邊有越界的情況,提前處理一下
class Solution { public int singleNonDuplicate(int[] nums) { if (nums.length == 1) return nums[0]; if (nums[0] != nums[1]) return nums[0]; int r = nums.length - 1; int l = 0; if (nums[r] != nums[r - 1]) return nums[r]; while (r - l > 5) { int mid = (r + l) / 2; if (nums[mid-1] != nums[mid] && nums[mid] != nums[mid+1]) return nums[mid]; if (nums[mid + 1] == nums[mid]) mid ++; if ((mid - l + 1)%2 == 0) l = mid + 1; else r = mid; } if (l == 0) l++; if (r == nums.length - 1) r--; for (int i = l; i <= r; i++) { if (nums[i - 1] != nums[i] && nums[i] != nums[i + 1]) return nums[i]; } return 0; }}
[LeetCode] 540. Single Element in a Sorted Array