leetcode 540 single element in a sorted array

leetcode 540 single element in a sorted array

老师您好想跟您请教一下标题的这个题目http://img1.sycdn.imooc.com//climg/610815db090194e810960569.jpg

能否提供一下思路呢参考了您的leetcode代码库发现没有这一题

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2021-08-03 16:44:52

我的参考代码(C++):

https://github.com/liuyubobobo/Play-Leetcode/blob/master/0501-1000/0540-Single-Element-in-a-Sorted-Array/cpp-0540/main.cpp



整体思路:


nums 最后补一个 -1,这样,整个数组一定有 2n 个数字,n 个不同的数字。


在数组开始的时候,每两个数字都是成对出现的,所以 2 * i 和 2 * i + 1 位置的数字应该是一样的;


直到出现了一个数字不是成对出现的,从这个数字往后,2 * i 和 2 * i + 1 的位置的数字就不一样了;


因为整个数组是有序的,我们可以二分搜索,找到这个 2 * i 和 2 * i + 1 的数字不一样的最早位置。


class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        
        nums.push_back(-1); // 补 -1,让整个数字的元素个数为偶数,这样不会出现数组越界
                            // 之所以补 -1 是因为数组元素 >= 0,所以 -1 不会和任何元素重复,是安全的
        int n = nums.size() / 2;
        int l = 0, r = n - 1;
        while(l < r){
            int mid = (l + r) / 2;
            if(nums[2 * mid] != nums[2 * mid + 1]) // 如果 2 * mid 和 2 * mid + 1 的元素不等
                r = mid; // 看看有没有更早的不等的位置
            else
                l = mid + 1; // 如果相等,肯定不是解
        }
        return nums[2 * l];
    }
};



继续加油!:)

  • 提问者 weixin_慕圣6334738 #1

    老师您好很精辟的回答但是这题我是用java写的我想请问java的话怎么在leetcode 中往array添加一个元素呢

    2021-08-04 10:42:50
  • liuyubobobo 回复 提问者 weixin_慕圣6334738 #2

    如果添加不方便的话就每次判断一下 2 * mid + 1 是否越界,越界等于相邻两个元素不等。

    2021-08-04 11:19:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师