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

简介: 每日一题 540. 有序数组中的单一元素

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

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

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

示例:

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

输出: 2

解:看到题目 中O(log n) 时间复杂度,容易想到二分查找。难点是这题中不是查找某一个值,而是查找一个单独的数。条件 nums[mid] ?? target 要如何改变?

单独元素前面有n对元素,即2n个元素,所以单独元素的下标一定是偶数。对偶数下标二分搜索。

若它与num[mid+1]是一对,则说明前面的都是成对的,low= mid+2;否则说明前面有单独的,high = mid。

class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        low, high = 0, len(nums) - 1
        while low < high:
            mid = (low + high) // 2
            mid -= mid & 1
            #mid -= mid & 1 作用是让mid取偶数。&是按位与,奇数&1 = 1,偶数&1 =0。
 
            if nums[mid] == nums[mid + 1]:
                low = mid + 2
            else:
                high = mid
        return nums[low]
 

如果 while循环用 <= 条件,需要high 初始化为len(nums)-2,否则会数组越界。 搜索空间为[0,len(nums)-2],实际上mid最大取值len(nums)-2在区间内,所以有不会遗漏。

class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        low, high = 0, len(nums) - 2
        while low <= high:
            mid = (low + high) // 2
            mid -= mid & 1
            if nums[mid] == nums[mid + 1]:
                low = mid + 2
            else:
                high = mid-2
        return nums[low]


相关文章
|
8月前
|
API
代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
33 0
【LeetCode-每日一题】-378. 有序矩阵中第K小的元素
【LeetCode-每日一题】-378. 有序矩阵中第K小的元素
|
1月前
|
算法
DAY-7 | 牛客-BM21 寻找旋转数组的最小元素:二分法分治思想真的很可靠
这是一个关于编程题目的摘要:题目是牛客网上的&quot;BM21 旋转数组的最小数字&quot;,要求找到旋转数组中的最小数字。题解介绍了使用二分查找算法来解决此问题,因为其时间复杂度优于暴力搜索的线性时间复杂度。二分查找的核心是通过比较中间元素与右端元素的大小,不断缩小搜索范围,最终找到最小值。代码示例展示了如何实现这个算法。总结中强调了二分查找适用于部分有序数组,并指出了解决这类问题的关键在于理解数组的二段单调性。
32 1
|
20天前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
1月前
leetcode-540:有序数组中的单一元素
leetcode-540:有序数组中的单一元素
23 0
LeetCode-540 有序数组中单一元素
LeetCode-540 有序数组中单一元素
|
人工智能 算法 BI
算法每日一题(合并两个有序的数组)
算法每日一题(合并两个有序的数组)
97 0
算法每日一题(合并两个有序的数组)
【牛客】合并两个有序的数组
【牛客】合并两个有序的数组
88 0
【牛客】合并两个有序的数组
数据结构与算法之美 | 二分查找:剑指offer53 在排序数组中查找数字
我们先分析如何找到第一个k。二分查找算法总是先拿数组中间的数字和k做比较。如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可以了。如果中间的数字比k小,那么k只有可能出现在数组的后半段,下一轮我们只在数组的后半段查找就可以了。
|
Serverless
LeetCode每日一题题解:540. 有序数组中的单一元素
LeetCode每日一题题解:540. 有序数组中的单一元素