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

35. 搜索插入位置

时间:2024-01-26 21:56:20浏览次数:29  
标签:right target nums int mid 35 插入 搜索 left

1.题目介绍

2.题解

2.1 二分查找(递归实现)

思路

利用递归+二分查找实现对于目标数target索引位置(存在)或者插入位置的索引(不存在)
1.递归返回条件:
left > right,在通过二分法寻找到最接近target的值nums[mid]依旧不等于target,也就是left == right的情况依旧不满足,说明数组中并不存在target,应选择插入
按道理来说target的索引应存在于[left,right]的范围内,但如果出现left > right,说明数组中不存在target,插入位置选择如下:
1.1 这时候如果该 nums[mid(此时mid = left = right)] < target , 走[mid + 1(left + 1 = right + 1), right],相当于在left + 1上插入,
left是整个数组中小于target数中最接近target的,下一个就是大于target的或者不存在了,所以插入在left + 1上是合理的。
1.2 这时候如果该 nums[mid(此时mid = left = right)] > target , 走[left, mid - 1],相当于在left上插入
left是整个数组中大于target数中最接近target的,上一个就是小于target的或者不存在了,所以插入在left上是合理的。
2.这里使用 int mid = left + (right - left) / 2; 而不是直接 /2,是避免left + right 过大造成溢出。
3.下面的三段if判断就是一般二分递归查找的步骤了

代码

class Solution {
public:
    int getIndex(vector<int>& nums, int left, int right, int target) {
        if (left > right) {
            return left;  // 找到插入位置
        }

        int mid = left + (right - left) / 2;

        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            return getIndex(nums, mid + 1, right, target);
        } else {
            return getIndex(nums, left, mid - 1, target);
        }
    }

    int searchInsert(vector<int>& nums, int target) {
        return getIndex(nums, 0, nums.size() - 1, target);
    }
};

2.2 二分查找(迭代)

思路

迭代的思路非常简单,如代码:

代码

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] == target) return mid;
            else if(nums[mid] > target) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
};

标签:right,target,nums,int,mid,35,插入,搜索,left
From: https://www.cnblogs.com/trmbh12/p/17990809

相关文章

  • 【板子】冒泡/选择/插入 排序
    #include<bits/stdc++.h>usingnamespacestd;#defineN101inta[N];voidsort_mp(){for(inti=1;i<100;i++){for(intj=1;j<100;j++){if(a[j]>a[j+1]){swap(a[j],a[j+1]);......
  • OpenAI 宣布将通过更新解决 GPT-4 变懒问题丨 RTE 开发者日报 Vol.135
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • Easysearch:语义搜索、知识图和向量数据库概述
    什么是语义搜索?语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。传统的关键词搜索主要依赖于对关键......
  • itop-RK3588开发板机器视觉开发OpenCV-Python的安装
    由于 iTOP-RK3588 编译安卓和 Linux 源码使用的 ubuntu 版本为 ubuntu20.04,为了方便和统一,本手册的实验环境也为 Ubuntu20.04,如果使用的是其他版本的 ubuntu。可能会存在一些细微的区别,建议大家所使用的 ubuntu 版本和我们保持一致。使用以下命令安装 OpenCV-Python,安......
  • 迅为RK3568开发板实时系统测试-Xenomai测试
    支持Xenomai内核的实时系统有buildroot,debian和ubuntu。在buildroot系统中自带cyclictest,如果是ubuntu系统或者debian系统,可以在开发板联网之后,使用apt安装,输入以下命令apt-getinstallrt-tests在烧写非实时内核的buildroot镜像之后,使用cyclictest测试,执行以下命令:cyclictest-S......
  • itop-RK3588开发板机器视觉开发OpenCV-Python的安装
    由于 iTOP-RK3588 编译安卓和 Linux 源码使用的 ubuntu 版本为 ubuntu20.04,为了方便和统一,本手册的实验环境也为 Ubuntu20.04,如果使用的是其他版本的 ubuntu。可能会存在一些细微的区别,建议大家所使用的 ubuntu 版本和我们保持一致。使用以下命令安装 OpenC......
  • Easysearch:语义搜索、知识图和向量数据库概述
    什么是语义搜索?语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容,而不仅仅是根据关键词匹配,还通过分析查询的语义和上下文来提供更准确和相关的搜索结果。传统的关键词搜索主要依赖于对......
  • 将关键词优化到搜索引擎首页的方法?
    将关键词优化到搜索引擎首页的方法?下面跟北京wordpress建站公司小编一起来了解详细内容:新手在做网站SEO优化时,如何提高网站首页的关键词排名?其实这也很简单,就是优化用户喜欢的内容到搜索引擎首页,这样网站才能有更好的排名,并吸引更多准确的用户流量。在资金充足的情况下......
  • 搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战
    搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战可以说,DeepFM是目前最受欢迎的CTR预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的:1、Deepfm的原理,DeepFM是一个模型还是代表了一类模型,DeepFM对FM做了什么样的改进,FM的公式如何化简并求......
  • SAP dialog 自定义搜索帮助 案例+源码
    同之前的blog一样,新建一个9000的屏幕,元素清单配好ok_code即可前置准备准备一个屏幕,具体步骤和之前一样,这边也按步骤做一下状态栏因为这个只是用于搜索帮助的演示,所以不需要应用应用程序工具栏,只需要设置功能键方便返回测试即可标题9000程序PROCESSBEFOREOUTPUT.......