前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​LeetCode刷题实战540:有序数组中的单一元素

​LeetCode刷题实战540:有序数组中的单一元素

作者头像
程序员小猿
发布2022-03-03 16:17:57
2210
发布2022-03-03 16:17:57
举报
文章被收录于专栏:程序IT圈

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 有序数组中的单一元素,我们先来看题面:

https://leetcode-cn.com/problems/single-element-in-a-sorted-array/

You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once.Return the single element that appears only once. Your solution must run in O(log n) time and O(1) space.

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

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

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

示例

代码语言:javascript
复制
示例 1:

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

示例 2:

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

解题

看到"有序数组", “ O(log n)时间复杂度和 O(1)空间复杂度”,就应该想到“二分搜索法”。代码如下:

代码语言:javascript
复制
class Solution {
    public int singleNonDuplicate(int[] nums) {
   int left = 0;
        int right = nums.length - 1;
        while (left < right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == nums[mid + 1]){ // 和u右边相等
                int c = mid - left; //mid左边个数
                if (c%2 == 0){ // 偶数个
                    left = mid + 2;
                }else{
                    right = mid - 1;
                }
            }else if (nums[mid] == nums[mid - 1]){
                int c = right - mid; // mid右边个数
                if (c%2 == 0){ // 偶数个,说明在左边
                    right = mid - 2;
                }else{ // 奇数个,说明在右边
                    left = mid + 1;
                }
            }else{ // 1,1,2,3,3, 不等于右边,也不等于右边,直接返回
                return nums[mid];
            }
        }

        return nums[left];
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-520题汇总,希望对你有点帮助!

LeetCode刷题实战521:最长特殊序列 Ⅰ

LeetCode刷题实战522:最长特殊序列 II

LeetCode刷题实战523:连续的子数组和

LeetCode刷题实战524:通过删除字母匹配到字典里最长单词

LeetCode刷题实战525:连续数组

LeetCode刷题实战526:优美的排列

LeetCode刷题实战527:单词缩写

LeetCode刷题实战528:按权重随机选择

LeetCode刷题实战529:扫雷游戏

LeetCode刷题实战530:二叉搜索树的最小绝对差

LeetCode刷题实战531:孤独像素 I

LeetCode刷题实战532:数组中的K-diff数对

LeetCode刷题实战533:孤独像素 II

LeetCode刷题实战534:游戏玩法分析 III

LeetCode刷题实战535:TinyURL 的加密与解密

LeetCode刷题实战536:从字符串生成二叉树

LeetCode刷题实战537:复数乘法

LeetCode刷题实战538:把二叉搜索树转换为累加树

LeetCode刷题实战539:最小时间差

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档