leetcode每日一题 540. 有序数组中的单一元素 情人节特别篇 一堆情侣中找单身狗~ 小丑竟是我自己

本文探讨了如何在情人节主题下,利用O(logn)时间复杂度和O(1)空间复杂度解决LeetCode题目540,通过有序数组找到唯一出现一次的元素,揭示了配对算法与二分查找的巧妙应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📖本篇内容:leetcode每日一题 540. 有序数组中的单一元素 情人节特别篇 一堆情侣中找单身狗~ 没想到小丑是我自己

📑 文章专栏:leetcode每日一题《打卡日常》

📆 最近更新:2022年2月13日 leetcode每日一题 1189. “气球” 的最大数量 简单的模拟题~

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊写在前面🙊

今天是情人节 不过 这题出的深意让人脑瓜子嗡嗡的,俩俩配对,找单出来的元素,好家伙直接破防,情侣中找单身狗,没想到啊,小丑竟是我自己~

题目

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

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

你设计的解决方案必须满足 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 <= 10^5
0 <= nums[i] <= 10^5

📝思路📝

本题考查知识点

解题思路大致有两种:

  • 第一种:直接暴力AC 因为这是一个有序数组,如果从第一组元素(一组元素为2个)开始,如果出现一组元素不相同时 那么二者之间肯定有一个是单身元素。当然也可以采用哈希表计数。
  • 第二种:因为本题希望时间复杂度为 logn 那就不能采用暴力的方式了,两两配对,二分查找。

⭐代码实现⭐

暴力AC

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int n= nums.length;
        //俩两凑对子 如果该分组中出现不一致则不是情侣 返回第一个元素
        for(int i=0;i<n-1;i+=2){
            if(nums[i] != nums[i+1]){
                return nums[i];
            }
        }
        //如果遍历到最后一个元素时直接返回这个单身狗
        return nums[n-1];
    }
}

二分(情人节 二分法真的好么?)

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        int mid ;
		//直接套模板就是了
        while(left < right){
            mid = left + (right - left )/2;
            if (mid % 2 == 1)mid--;
            if (nums[mid] == nums[mid+1])
                left+=2;
            else {
                right = mid;
            }
        }
        return nums[left];
    }
}

运行结果

暴力AC

在这里插入图片描述

二分查找
在这里插入图片描述

🙊写在最后🙊

2022-2-14今天小付打卡了哦~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值