LeetCode 540
Single Element in a Sorted Array
- Problem Description:
题目给出一个从小到大排序的数组,其中只有一个元素出现一次,要求找出该元素。
具体的题目信息:
https://leetcode.com/problems/single-element-in-a-sorted-array/description/ - Solution:
- 解题思路:
(1)方法一:常规想法,记录第一次出现的元素,看该元素下一位是否与该元素相同,如果不是,则该元素为出现一次的元素。
(2)方法二:二分查找(参考:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3.md#%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE) - 编程实现:
(1)方法一:
- 解题思路:
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
if (nums.size() == 0) return 0;
int temp = nums[0], count = 0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == temp) {
count++;
}
if (count == 1) {
count = 0;
temp = nums[++i];
} else {
return temp;
}
}
return temp;
}
};
(2)方法二:
int singleNonDuplicate(vector<int>& nums) {
int l = 0, h = nums.length - 1;
while (l < h) {
int m = l + (h - l) / 2;
if (m % 2 == 1) {
m--; // 保证 l/h/m 都在偶数位,使得查找区间大小一直都是奇数
}
if (nums[m] == nums[m + 1]) {
l = m + 2;
} else {
h = m;
}
}
return nums[l];
}