- 链接:
https://leetcode.cn/problems/skFtm2/ - 题目:
给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
示例:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
- 思路:
因为数组有序,所以出现两次的元素是紧紧挨在一起的。
所以我们可以把该数组看成两串数组,一串由偶数索引组成,一串由奇数索引组成。
然后,我们对两串数组进行一一比较,当元素不相等时,返回偶数索引的元素。
比如:nums = [1,1,2,3,3,4,4,8,8]
首先,将数组元素与索引进行一一对照。
然后,可以分为两串数组。
对两串数组进行一一对比。找出不相等的元素,并返回。
- 代码:
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
//i用来记录偶数索引数组,j用来记录奇数索引数组
int n=nums.size(),i,j;
//当数组元素小于2时,数组元素即为我们要找的值
if(n<2)
return nums[0];
for(i=0,j=1;i<n&&j<n;){
//一旦奇偶索引的元素不相等,救返回偶数索引的值
if(nums[i]!=nums[j])
return nums[i];
//因为分奇偶索引,索引i,j每次+2
i+=2;
j+=2;
}
//如,nums=[1,1,2],在进行上面的比较时,超出数组范围,
//直接返回最后的偶数索引值
return nums[i];
}
};