给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
难度:中等 题目地址:https://leetcode-cn.com/problems/single-element-in-a-sorted-array/
int singleNonDuplicate(int* nums, int numsSize){
int left=0,right=numsSize-1;
while(left<right){
int mid = left + (right - left) / 2;
if(mid%2==1){
if(nums[mid]==nums[mid+1]) right=mid-1;
else left=mid+1;
}else{
if(nums[mid]==nums[mid+1]) left=mid+2;
else right=mid;
}
}
return nums[left];
}
解释: 因为是有序数组,所以可以用二分法。思路:取数组中间的数,当中间数的下标为奇数,说明前后元素的个数为奇数,偶数则剩余个数为偶数。奇数时:当nums[mid]等于[mid+1],唯一数处于前mid-1,反之处于后mid+1。偶数时:当nums[mid]等于[mid+1],唯一数处于后mid+2,反之处于前mid.(就是要保证剩余查找元素个数奇数)
知识点回顾: 无。
class Solution {
public int singleNonDuplicate(int[] nums) {
int num = 0;
for(int i : nums)
num ^= i;
return num;
}
}
解释: 直接用位运算,已知两个相同的数异或之后为0,所以把数组所有的数都异或了之后就是剩下的值了。
知识点回顾: ^的运算法则:只有在两个比较的位不同时其结果是1,否则结果为0。
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
return 2*sum(set(nums)) - sum(nums)
解释: 将原数组去重*2,减去原数组,剩下的就是唯一的值。
知识点回顾: 无。
/**
* @param {number[]} nums
* @return {number}
*/
var singleNonDuplicate = function(nums) {
for(let i = 0; i<nums.length;i+=2){
if(nums[i]!=nums[i+1]) return nums[i]
}
};
解释: 因为有序数是成对出现,所以特殊数出现的下标一定是偶数位,所以只需要拿偶数位下标去跟下一位下标的值去比较即可。
知识点回顾: 无。