跳到主要内容

540.有序数组中的单一元素

链接:540.有序数组中的单一元素
难度:Medium
标签:数组、二分查找
简介:给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。

题解 1 - cpp

  • 编辑时间:2022-02-14
  • 执行用时:16ms
  • 内存消耗:21.9MB
  • 编程语言:cpp
  • 解法介绍:bs。
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
return bs(nums, 0, nums.size() - 1);
}
int bs(vector<int>& nums, int l, int r) {
int n = r - l + 1, m = (l + r) >> 1;
if (n == 1 || nums[l] != nums[l + 1]) return nums[l];
if (nums[r] != nums[r - 1]) return nums[r];
if (nums[m] != nums[m - 1] && nums[m] != nums[m + 1]) return nums[m];
if (nums[m] == nums[m - 1]) m--;
if ((m - l) & 1)
return bs(nums, l, m - 1);
else
return bs(nums, m + 2, r);
}
};

题解 2 - cpp

  • 编辑时间:2022-02-14
  • 执行用时:20ms
  • 内存消耗:21.9MB
  • 编程语言:cpp
  • 解法介绍:bs, 如果是偶数下标与后面的比,奇数下标与前面的比。
class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int l = 0, r = nums.size() - 1, m;
while (l < r) {
m = (l + r) >> 1;
if (nums[m] == nums[m ^ 1])
l = m + 1;
else
r = m;
}
return nums[l];
}
};

题解 3 - undefined

  • 编辑时间:2024-11-10
  • 执行用时:4ms
  • 内存消耗:23.52MB
  • 编程语言:undefined
  • 解法介绍:遍历时用异或去重。
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
return reduce(lambda a, b: a ^ b, nums, 0)