跳转至

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

题目描述

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。

请你找出并返回只出现一次的那个数。

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

 

示例 1:

输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2

示例 2:

输入: nums =  [3,3,7,7,10,11,11]
输出: 10

 

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105

解法

方法一:二分查找

题目给定的数组 \(\textit{nums}\) 是有序的,且要求在 \(\textit{O}(\log n)\) 时间找到只出现一次的元素,因此我们考虑使用二分查找解决。

我们定义二分查找的左边界 \(\textit{l} = 0\),右边界 \(\textit{r} = n - 1\),其中 \(n\) 是数组的长度。

在每一步中,我们取中间位置 \(\textit{mid} = (l + r) / 2\),如果下标 \(\textit{mid}\) 为偶数,那么我们应该将 \(\textit{nums}[\textit{mid}]\)\(\textit{nums}[\textit{mid} + 1]\) 进行比较;如果下标 \(\textit{mid}\) 为奇数,那么我们应该将 \(\textit{nums}[\textit{mid}]\)\(\textit{nums}[\textit{mid} - 1]\) 进行比较。因此,我们可以统一将 \(\textit{nums}[\textit{mid}]\)\(\textit{nums}[\textit{mid} \oplus 1]\) 进行比较,其中 \(\oplus\) 表示异或运算。

如果 \(\textit{nums}[\textit{mid}] \neq \textit{nums}[\textit{mid} \oplus 1]\),那么答案在 \([\textit{l}, \textit{mid}]\) 中,我们令 \(\textit{r} = \textit{mid}\);如果 \(\textit{nums}[\textit{mid}] = \textit{nums}[\textit{mid} \oplus 1]\),那么答案在 \([\textit{mid} + 1, \textit{r}]\) 中,我们令 \(\textit{l} = \textit{mid} + 1\)。继续二分查找,直到 \(\textit{l} = \textit{r}\),此时 \(\textit{nums}[\textit{l}]\) 即为只出现一次的元素。

时间复杂度 \(\textit{O}(\log n)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度。空间复杂度 \(\textit{O}(1)\)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r) >> 1
            if nums[mid] != nums[mid ^ 1]:
                r = mid
            else:
                l = mid + 1
        return nums[l]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
    public int singleNonDuplicate(int[] nums) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int mid = (l + r) >> 1;
            if (nums[mid] != nums[mid ^ 1]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return nums[l];
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;
        while (l < r) {
            int mid = (l + r) >> 1;
            if (nums[mid] != nums[mid ^ 1]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return nums[l];
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func singleNonDuplicate(nums []int) int {
    l, r := 0, len(nums)-1
    for l < r {
        mid := (l + r) >> 1
        if nums[mid] != nums[mid^1] {
            r = mid
        } else {
            l = mid + 1
        }
    }
    return nums[l]
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function singleNonDuplicate(nums: number[]): number {
    let [l, r] = [0, nums.length - 1];
    while (l < r) {
        const mid = (l + r) >> 1;
        if (nums[mid] !== nums[mid ^ 1]) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return nums[l];
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
impl Solution {
    pub fn single_non_duplicate(nums: Vec<i32>) -> i32 {
        let mut l = 0;
        let mut r = nums.len() - 1;
        while l < r {
            let mid = (l + r) >> 1;
            if nums[mid] != nums[mid ^ 1] {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        nums[l]
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int singleNonDuplicate(int* nums, int numsSize) {
    int l = 0, r = numsSize - 1;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (nums[mid] != nums[mid ^ 1]) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return nums[l];
}

评论

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy