首页 > 其他分享 >leet code 35.搜索插入位置

leet code 35.搜索插入位置

时间:2023-09-10 11:00:37浏览次数:38  
标签:leet code int mid 35 len 数组 ans 目标值

简单题蕴含大学问

link leet code 35.搜索插入位置

思路历程

学习算法已有时日,再做这一道简单程度的二分题目时-发现还是不能游刃有余地掌握。 题目中要求:需要在数组中找到目标值,并返回其索引,如果目标值不存在于数组中的话,返回其将会被顺序插入的位置。 那么有两种情况

  1. 目标值在数组中存在
  2. 目标值在数组中不存在

如何兼顾这两种情况呢?

  • 首先考虑目标值在数组中存在的情况。
int mid = (low + high) / 2;
if (arr[mid] == target) {
    // 找到目标值,退出循环
} else if (arr[mid] < target) {
    low = mid + 1; // 更新low
} else {
    high = mid - 1; // 更新high
}

  • 明确目标:也就是说,需要找到目标值所在的索引位置。如果不在的话,返回下一位。
  • 代码如何实现?
class Solution {
    public int searchInsert(int[] nums, int target) {
        int len = nums.length;
        // 初始化结果
        int ans = len;
        int left = 0,right = len - 1;

        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] >= target) {
                // 这里用 ans 记录查找的目标元素的位置。
                // 一定不会遗漏
                // 当数组元素存在的时候,ans 输出目标值所在位置的索引
                // 当数组元素不存在的时候,ans 数组最接近目标值所在位置的索引
                // 初始化 ans = len,即当目标值大于数组中元素的最大值的时候,需要插入的位置是  len.
                ans = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return ans;
    }
}

二分算法小技巧

确定边界条件

在使用二分算法时,边界条件非常重要,需要仔细考虑。可以通过画图或者手动模拟的方式,验证边界条件是否正确。

确定中间值

在计算中间值时,需要注意整数除法的向下取整规则。如果使用C++或Java等语言,可以使用整数除法符号“/”或位运算符号“>>”来计算中间值。

注意特殊情况

在使用二分算法时,需要注意特殊情况,比如查找第一个大于目标值的位置、查找最后一个小于目标值的位置、查找旋转排序数组中的最小值等。这些特殊情况可能需要对二分算法进行一些变形或扩展。

标签:leet,code,int,mid,35,len,数组,ans,目标值
From: https://blog.51cto.com/u_16079703/7424025

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:用栈实现队列
    题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:voidpush(intx) 将元素x推到队列的末尾intpop() 从队列的开头移除并返回元素intpeek() 返回队列开头的元素booleanempty() 如果队列为空,返回 true ......
  • #yyds干货盘点# LeetCode程序员面试金典:等差数列划分
    1.简述:如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。子数组 是数组中的一个连续序列。 示例1......
  • P3533 [POI2012] RAN-Rendezvous 题解
    P3533[POI2012]RAN-Rendezvous题目大意:给定外向树森林,每次给定两个起始点,求两个点沿边移动最少步数相遇。\(n\)个点,\(n\)条边,并且每个点有唯一的出边,显然构成了多棵基环树,对于每个基环树分别处理:找出环上的点,因为要求支持求出任意两点距离,前缀和一下即可。对于询问,如果在两......
  • Codeforces Round 824 (Div. 2) B. Tea with Tangerines
    有\(n\)块橘子皮,第\(i\)块大小为\(a_i\)。在一部操作中可以把一块橘子皮分成两块,即这块橘子皮为\(x\),让\(x\)变为\(y,z(x=y+z)\)。希望对于任意两块橘子皮,他们相差严格小于两倍。即两块中更小的为\(x\),更大的为\(y\),有\(2x>y\)。最少需要执行多少步操作......
  • [刷题记录Day 23]Leetcode二叉树
    No.1题目修剪二叉搜索树思路递归法有点抽象,要对具体案例做模拟才好懂递归分析返回值:节点,参数:节点,[下界,上界]终止条件:遇到空节点,返回空单层递归逻辑:判断不在范围内的情况:当前节点小于下界/大于上界,直接返回右/左子树递归结果;若在范围内,则递归筛查左右子树,返回当前节点......
  • 【题解】Educational Codeforces Round 143(CF1795)
    A.TwoTowers题目描述:有\(a,b\)两座由红蓝色方块垒成的塔,其中\(a\)的高度为\(n\);\(b\)的高度为\(m\),用R代表红色;用B代表蓝色。你可以多次把其中一座顶端的方块移到另一座的顶端(可以不移动)。问有没有一种方法可以使两座塔中均没有连续的同颜色方块。题目分析:可以......
  • 在 Visual Studio Code 里如何设置让搜索忽略指定的文件夹
    我今天在VisualStudioCode里根据关键字@spartacus/smartedit进行搜索时,发现VisualStudioCode也把文件夹.angular里的文件一并搜索了:C:\Code\SPA\6.0.x.angular\cache\15.2.4\babel-webpack\00e62bc8b359a06bfe0641d2c1403dc3443ea1190700c09d90a94ab550ad973f.json......
  • 用 Visual Studio Code 开发 Angular 应用自动生成的 .angular 文件夹
    在Angular开发中,项目根目录下的.angular文件夹是AngularCLI工具的一部分,它包含了一些配置和缓存文件,用于提高开发效率和构建性能。.angular文件夹的作用主要包括:缓存构建信息:.angular文件夹中包含了一些缓存文件,用于存储先前构建的信息,以加速后续的构建过程。这有助于......
  • 一个由于前端缺少 encodeURIComponent 引起的登录问题的分析和解决
    笔者最近三年一直在SAP中国研究院担任Angular应用开发程序员的职位,负责的产品是SAP电商云SpartacusUI的开发。Spartacus是SAP公司主导的一个开源项目,Github项目地址:https://github.com/SAP/spartacus.电商云StorefrontUI界面如下,客户如果想在上面下单,需要点击Si......
  • Codeforces Round 827 (Div. 4) C. Stripes
    在一个\(8\times8\)的网格上,一开始无色。每次一整行或一整列地染色,后染的颜色会覆盖前染的颜色。染色方式有两种,一种是横着染\(R\)色,一种是竖着染\(B\)色。给出最终染色的网格,问最后染的色是哪种。对每行开\(R\)计数器、每列开\(B\)计数器。遍历行、列,如果计数器的......