Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这些评论有点意思。

这些评论有点意思。

作者头像
五分钟学算法
发布于 2023-10-03 05:25:20
发布于 2023-10-03 05:25:20
21600
代码可运行
举报
文章被收录于专栏:五分钟学算法五分钟学算法
运行总次数:0
代码可运行

每天我都会有一些摸鱼时间,一般都喜欢逛脉脉、知乎、LeetCode 评论区。

今天又在 LeetCode 评论区看到一个很有意思的评论。

这个评论并没有给出什么骚话,不过很有道理,我们的解题代码得用上题目给出的每个条件才是一个好的解题代码。

首先给没有见过这道题目的小伙伴补充一下前置知识,这道题目讲的是:

一个长度为 n - 1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 ~ n - 1 之内。

在范围 0 ~ n - 1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。

比如数组为 [0,1,2,3,4,5,6,7,9],注意到 8 不在里面,因此输出 8 。

如果在面试的时候拿到这个题目,交出的代码是遍历的方式,那真的就和评论区的老哥留言的那样:

所有题都拿来遍历,offer也就遍历到别人那里去了。

面试官看到你提交的代码,会笑呵呵的让你回去等通知,好一点的会问你能不能再优化一下

很明显,遍历的方式没有用到题目给出的所有条件:

  • 所有数字都是唯一的
  • 每个数字都在范围 0 ~ n - 1 之内
  • 有且只有一个数字不在该数组中

这里给大家一个小技巧,但凡看到数组搜索相关的词语,第一想法可以去尝试二分法

如果每一个数字都出现正确的位置上,即它们和索引之间的对应关系都是一样的,比如数字 0 出现在索引位置为 0 的地方、数字 1 出现在索引位置为 1 的地方、数字 2 出现在索引位置为 2 的地方。。。

而如果发现有数字没有出现在正确的位置上,也就是发生了错位,比如数字 9 出现在索引位置为 8 的地方,那么由于有且只有一个数字不在该数组中,那么很明显数字 10 出现在索引位置为 9 的地方、数字 11 出现在索引位置为 10 的地方。。。

图片

我们只需要找到第一个发生了错位的地方就可以了

也就是说,原来的整个数组实际上是包含了两个部分。

  • 1、一个部分上面所有的数字都正确的位置上;
  • 2、另外一部分上面所有的数字都不在正确的位置上

那么就利用二分法的思路,不断的缩小查找区间,也就能找到第一个发生了错位的数字。

这里直接给出代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int missingNumber(int[] nums) {


        // left 指向当前区间的最左边位置,所以初始化为 0
        int left = 0 ;

        // right 指向当前区间的最右边位置,所以初始化为 nums.length - 1
        int right = nums.length - 1;

        // 循环进行二分查找,直到左端点位置超过了右端点
        while( left <= right ) {

            // 计算当前区间的中间位置,向下取整
            int mid = (left + right) / 2;
            
            // 如果中间位置的元素值等于当前索引的值
            // 那么说明从 left 到 mid 的这些元素都在正确的位置上
            // 即从 left 到 mid 的这些数字都在数组中,没有发生缺失
            // 所以需要在 mid + 1 到 right 这个区间去查找缺失的数字
            if(nums[mid] == mid){

                // 缩小范围为 mid + 1 到 right
                // 当前区间的左侧为 left = mid + 1,右侧 right 
                left = mid + 1;

            // 否则,说明从 left 到 mid 的这些元素,有元素不在正确的位置上
            // 即从 left 到 mid 的这些数字有数字发生缺失
            // 所以需要在 left 到 mid - 1 这个区间去查找缺失的数字
            }else{

                // 所以缩小范围为 left 到 mid - 1
                // 当前区间的左侧为 left,右侧 right = mid - 1
                right = mid - 1;

            }
        }

        // 由于只有一个数字缺失,所以找到的时候,left 指向的那个数字就是,使得后面所有数字与索引不一一对应时的第一个数字
        // 返回就行
        return left;
    }
}

以上就是今天分享的全部内容。

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

本文分享自 五分钟学算法 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这道算法题太太太太太简单啦
题目来源于 LeetCode 上第 268 号问题:缺失数字。题目难度为 Easy,目前通过率为 50.2% 。
五分钟学算法
2019/05/21
4230
这道算法题太太太太太简单啦
【二分查找】详细图解[通俗易懂]
比如在一个有序的数组并且无重复元素的数组中,例如[1, 2, 3, 4, 5, 6],需要查找3的位置就可以使用二分查找。
全栈程序员站长
2022/09/27
5.3K0
【二分查找】详细图解[通俗易懂]
一网打尽!二分查找解题模版与题型全面解析
二分查找算是最为基本的一个算法,也比较容易掌握。但是有些时候,我们可能因为一些细节的点没有考虑全而程序出错。
五分钟学算法
2019/08/16
9370
一网打尽!二分查找解题模版与题型全面解析
程序员进阶之算法练习(八十四)
题目链接 题目大意: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
落影
2023/09/03
1760
【算法题解】 Day20 查找
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
sidiot
2023/08/26
2940
剑指Offer题解 - Day7
一个长度为 n-1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 ~ n-1 之内。在范围 0 ~ n-1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。
chuckQu
2022/08/19
1890
剑指offer | 面试题8:旋转数组的最小数字
如下图所示,寻找旋转数组的最小元素即为寻找 右排序数组 的首个元素 nums[x] ,称 x 为 旋转点 。
千羽
2021/12/29
2570
剑指offer | 面试题8:旋转数组的最小数字
【优选算法篇】在旋转与缺失间寻踪:二分查找的妙趣演绎
给定一个由整数组成的山脉数组 arr,返回其峰顶索引 i,即满足条件 arr[i] 是整个数组中最大的元素,并且左右两边的数据呈现先升后降的趋势。
半截诗
2025/05/29
1130
【优选算法篇】在旋转与缺失间寻踪:二分查找的妙趣演绎
搜索旋转排序数组(leetcode 33)
如数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。
恋喵大鲤鱼
2023/10/12
2170
搜索旋转排序数组(leetcode 33)
【算法一周目】数据深处的舞者:二分查找的优雅与力量
给定一个升序排列的整数数组 nums,和一个目标值 target。如果 target 在数组中存在,返回其下标;否则,返回 -1。
HZzzzzLu
2024/12/26
1060
【算法一周目】数据深处的舞者:二分查找的优雅与力量
LeetCode-35. 搜索插入位置(java)
       一看到这题,不就一次遍历就可确定位置么,so easy啊!直接白班裸写,啪的一下就提交了。但是提交结果却反馈提示"超出时间限制",郁闷了啊,再仔细看了一遍题,才知道,有限制啊!要求​​算法时间复杂度​​​为​​Olog(n)​​​,仔细一想,​​二分法​​不就符合要求么!然后裸写了一个二分查找,很好!过了,接下来我就来讲讲二分法具体怎么运用?
bug菌
2023/05/27
2750
LeetCode-35. 搜索插入位置(java)
有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
下面的动画以 「力扣」第 704 题:二分查找 为例,展示了使用这个模板编写二分查找法的一般流程。
帅地
2019/10/15
6080
有了这套模板,女朋友再也不用担心我刷不动 LeetCode 了
二分法还需要练习练习
力扣题目链接:https://leetcode-cn.com/problems/search-insert-position/
代码随想录
2021/10/20
4380
【OJ】Chapter 01 - (旋转数组的最小数字、数字在升序数组中出现的次数、错误的集合) 超详细讲解
题目链接:旋转数组的最小数字(JZ11) 题目描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
埋头编程
2024/10/16
1460
【OJ】Chapter 01 - (旋转数组的最小数字、数字在升序数组中出现的次数、错误的集合) 超详细讲解
【算法】二分法 ② ( 排序数组中查找目标值 | 二分法的经典写法 | 在排序数组中查找元素的最后一个位置 | 二分法的通用模板 )
https://leetcode.cn/problems/binary-search/
韩曙亮
2023/03/30
8090
(四)算法基础——二分算法
求下面方程的一个根:f(x) = x3 -5x2+10x-80 = 0 若求出的根是a,则要求 |f(a)| <= 10^-6
小点点
2022/12/12
5590
(四)算法基础——二分算法
【leetcode速通java版】01——数组入门
上面的地址经过了处理,不过它们都没有规律,显然不连续。实际上,java的二位数组可能是这样的。
半旧518
2022/10/26
3190
【leetcode速通java版】01——数组入门
【C++例题 / 训练】二分算法(模板 & 例题)
以在一个升序数组中查找一个数为例,每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值同理,只需到左侧查找
IsLand1314
2024/10/15
1680
【C++例题 / 训练】二分算法(模板 & 例题)
二分查找算法,数组有序不是必要条件!
先来一段维基百科概念。“二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。”
用户8639654
2021/07/23
1.5K0
面试手撕算法系列:二分法
这些都是LeetCode上有的题目 手撕无非就是 树、链表、二分、字符串这些常用的数据结构
程序员小猿
2021/01/19
5920
面试手撕算法系列:二分法
推荐阅读
相关推荐
这道算法题太太太太太简单啦
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档