首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【二分法】LeetCode-Search Insert Position

【二分法】LeetCode-Search Insert Position

作者头像
MapleYe
发布于 2020-03-28 13:04:24
发布于 2020-03-28 13:04:24
54500
代码可运行
举报
文章被收录于专栏:MapleYeMapleYe
运行总次数:0
代码可运行

前言

今天在LeetCode遇到一个这样的题目.

SearchInsertPosition@2x.png

题目意思就是给一个排好序的数组和要寻找的数,若数组存在,返回它的index,否则返回它该插入的位置。

思考

拿到这个问题,哇,这不就是普通的二分法吗?那就刷刷的写下了二分法的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func searchInsert(_ nums: [Int], _ target: Int) -> Int {
    var low = 0
    var high = nums.count - 1
    var mid = -1
    while low <= high {
        mid = (high + low) / 2
        if target == nums[mid] {
            return mid
        }else if target > nums[mid] {
            low = mid + 1
        }else {
            high = mid - 1
        }
    }
    return -1
}

以上代码是最原始的二分查找法,若存在返回对应的索引,不存在返回-1。而题目额外要求找不到,就返回要插入的位置。这时候我就纠结low,mid,high之间,究竟哪一个才是要插入的位置呢?想了半天没思绪,看了下答案,只需要将return -1改为return low就可以了。

疑惑

为什么是返回low,而不是返回high,或者是返回mid。所以我又搜了一下关于二分法的相关资料,看完这篇博客后,恍然大悟。

二分法有很多变种形式,例如查找最后一个等于或者小于key的元素等形式(可以去看该博客)。最后该博客,总结了二分法各形式变化,以下为该博客的结论:

1、首先确定返回的是left,还是right

  • 跳出while (left <= right)循环条件是right < left,且right = left - 1。
  • right和left一定是卡在"边界值"的左右两边
  • 如果是比较值为key,查找小于等于(或者是小于)key的元素,则边界值就是等于key的所有元素的最左边那个,其实应该返回left。

例子

以数组{1, 2, 3, 3, 4, 5}为例,如果需要查找第一个等于或者小于3的元素下标,我们比较的key值是3,则最后left和right需要满足以下条件:

例子.png

我们比较的key值是3,所以此时我们需要返回left

2、判断出比较符号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int mid = (left + right) / 2;
if (array[mid] ? key) {
    //... right = xxx;
}
else {
    // ... left = xxx;
}

也就是这里的 if (array[mid] ? key) 中的判断符号,结合步骤1和给出的条件,如果是查找小于等于key的元素,则知道应该使用判断符号>=,因为是要返回left,所以如果array[mid]等于或者大于key,就应该使用>=,以下是完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查找小于等于key的元素
int mid = (left + right) / 2;
if (array[mid] >= key) {
    right = mid - 1;
}
else {
    left = mid + 1;
}

为什么返回的是low

套用结论,high = low - 1

  • target小于所有元素,插入的位置是0,high为-1,low=0才能跳出循环
  • target大于所有元素,插入的位置的数组的长度count,high为count-1,low=count才能跳出循环
  • target小于数组中某些元素,大于某些元素,问题就转化为查找第一个大于target的元素下标。根据结论,high和low总是在临界值的两边,那么就相当于 high-target-low,因此返回low

总上述三种情况,返回low都符合题目要求

总结

看似简单的二分法,如果换种提问方式,或许就绕进去出不来了。因此,在这里做这个总结,加深自己的理解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
二分法还需要练习练习
力扣题目链接:https://leetcode-cn.com/problems/search-insert-position/
代码随想录
2021/10/20
4710
面试手撕算法系列:二分法
这些都是LeetCode上有的题目 手撕无非就是 树、链表、二分、字符串这些常用的数据结构
程序员小猿
2021/01/19
6480
面试手撕算法系列:二分法
35. Search Insert Position(二分法)
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
yesr
2019/03/14
3390
python面试题-【二分法查找】给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。
前言 给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。 题目 给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。 (用二分法查找解决) 示例 1: 输入: [1,3,5,6], 5 输出: 2 示例 2: 输入: [1,3,5,6], 2 输出: 1 示例 3: 输入: [1,3,5,6], 7 输出: 4 示例 4: 输入: [1,3,5,6], 0 输出: 0 二分法查找 二分查找也称折
上海-悠悠
2022/07/19
1.1K0
python面试题-【二分法查找】给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。
二分法其实很简单,为什么老是写不对!!
相信很多人对二分法是又爱又恨,爱是在于它思想简单,效率确实高, 恨是恨在为什么总是写不对呢
代码随想录
2020/06/11
1.1K0
二分法的左右边界
二分法用起来还是挺好用的,就是每次我总是纠结边界条件到底如何确定,用小于号还是小于等于号,满足条件后left是mid还是mid+1,为此专门做了两道简单题,整理了下思路。
伯约同学
2022/03/02
4800
Leetcode No.35 搜索插入位置(二分法)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
week
2022/01/07
2810
二分查找总结
二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找.
Tim在路上
2020/08/04
5270
【算法】二分法 ③ ( 山脉数组的峰顶索引 | 枚举法 | 二分法 )
https://leetcode.cn/problems/peak-index-in-a-mountain-array/description/
韩曙亮
2023/03/30
7190
算法学习笔记-二分法
leetcode875爱吃香蕉的珂珂https://leetcode-cn.com/problems/koko-eating-bananas/
买唯送忧
2021/05/09
4450
二分法题型小结
在刷题的过程中,二分法用的还是挺多的,有时候超时了往往是你没有用上二分法,今天我就来稍微总结下用的最多的三种二分法搜索。
帅地
2019/10/30
4930
六十七、二分查找算法及其四个变形问题
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是「有序不重复」的。二分法查找本质上就是分治算法。
润森
2022/08/17
7730
六十七、二分查找算法及其四个变形问题
LeetCode <二分搜索>34.Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
大学里的混子
2018/10/30
1.2K0
二分法检索
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较, ​ 如果相等:则检索成功;
ha_lydms
2023/08/09
2670
二分法检索
【算法】递归算法 ② ( 使用递归实现二分法 | if else 编码优化 )
https://leetcode.cn/problems/binary-search/
韩曙亮
2023/03/30
8060
数组:每次遇到二分法,都是一看就会,一写就废
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
代码随想录
2020/08/27
6780
数组:每次遇到二分法,都是一看就会,一写就废
二分法:一看就会,一写就废
题目链接:https://leetcode-cn.com/problems/binary-search/
代码随想录
2021/04/23
8450
【算法】二分法 ② ( 排序数组中查找目标值 | 二分法的经典写法 | 在排序数组中查找元素的最后一个位置 | 二分法的通用模板 )
https://leetcode.cn/problems/binary-search/
韩曙亮
2023/03/30
8510
搞定大厂算法面试之leetcode精讲5.二分查找
搞定大厂算法面试之leetcode精讲5.二分查找 视频教程(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 二分搜索 时间复杂度O(logn) 步骤: 从数组中间的元素开始,如果中
全栈潇晨
2021/11/24
3740
简单二分法查找(binary search)
有一个面试题是对一个1000万的数字进行快速查找,并且使用内存不能查过100M 答: 现在有1000个数字 每个数子大小为8Kb(为long基本类型) 那么现在占据用的内存 为800M 我们进行算法设计 ,将这个数据进行有序排列,组成为一个数组, 进而进行 折中查找,每一次在查找的时候取中间位置的数据,如下图(图片来源极客时间):
袁新栋-jeff.yuan
2020/08/26
6320
简单二分法查找(binary search)
推荐阅读
相关推荐
二分法还需要练习练习
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档