原題
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.
解題思路
這題如果沒有付加條件的話非常簡單,就一個迴圈判斷就好了。但是因為限制了時間複雜度為log(n),而平常的做法的時間複雜度為n,所以不行。搜索了一下O(logn)的算法,發現了二分查找法,剛好數組裏的數字是從小到大排列的,所以我們可以用二分查找找出目標數字。
代碼
int loop (int* nums, int left, int right);
int singleNonDuplicate(int* nums, int numsSize) {
return nums[loop(nums, 0, numsSize - 1)];
}
int loop (int* nums, int left, int right) {
if (left == right) {
return left;
}
else {
int middle = (left + right) / 2;
if (middle % 2 == 0) {
if (nums[middle] == nums[middle+1]) {
return loop(nums, left, middle-1);
}
else if (nums[middle] == nums[middle-1]) {
return loop(nums, middle+1, right);
}
else {
return middle;
}
}
else {
if (nums[middle] == nums[middle+1]) {
return loop(nums, middle+2, right);
}
else if (nums[middle] == nums[middle-1]) {
return loop(nums, left, middle-2);
}
else {
return middle;
}
}
}
}
感想
一開始沒有頭緒要怎麼做,雖然學過了二分查找法,但是沒有聯繫過實際去使用這個算法。這道題不難,只要知道了要用的算法,其實解出來很簡單。