LeetCode25 搜索插入位置

2024-03-03 23:36

本文主要是介绍LeetCode25 搜索插入位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 题目
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
    如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  2. 示例
    示例 1:输入: nums = [1,3,5,6], target = 5
    输出: 2
    示例 2:输入: nums = [1,3,5,6], target = 2
    输出: 1
    示例 3:输入: nums = [1,3,5,6], target = 7
    输出: 4
  3. 解题思路
    1. 方法一:首先本题思路,找到第一个大于等于target的元素位置,即插入位置。所以直接遍历数组,找到第一个大于等于target的元素位置就是结果。但本题要求时间复杂度为log(n),那么需要进行优化。
    2. 方法二:二分查找。算法思路:将数组分成两份,left=0,mid=(left + right) / 2,right=length-1。根据mid与target的大小,进一步划分区域。如果mid>target,说明target在0到mid之间。反之,在mid到length-1之间。将范围缩小(left = mid + 1 或 right = mid - 1 ), 继续比较。本题可以用二分查找的思想,不过算法是查找相等数据,本题需要查找第一个大于等于的数据。
      1. 这里说明下为什么以left进行返回:
        本题结果即找到第一个大于等于target的元素。在二分查找的过程中,遇到的第一个mid对应元素,大于target时,mid对应的元素不一定是第一个大于target元素,只是二分查找过程中遇到的第一个。此时需要继续缩小范围就继续比较。
        那么什么情况下是第一个呢?首先mid对应元素和target相等的时候直接返回mid位置,即插入位置。大于的情况,因为数组中不存在target,那么一定会遍历到left==right==mid的时候,如果这个元素大于target,根据二分查找算法原理,此时right = mid - 1,left>right跳出循环,left即结果;如果这个元素小于target,left = mid+1,left>right跳出循环,left即结果(已经加1)。这里不管是大于还是小于,mid的其他位置都是已经确认了大于或小于target了。那么如果这个位置小于target,那么它后面的就是第一个大于target的,如果这个位置大于target那么他就是第一个大于target的。
  4. 代码(Java)
    // 方法一
    class Solution {public int searchInsert(int[] nums, int target) {if (nums == null || nums.length == 0) {return -1;}if (nums[0] > target) {return 0;}if (nums[nums.length - 1] < target) {return nums.length;}for (int i = 0; i < nums.length; i++) {if (nums[i] >= target) {return i;}}return nums.length;}
    }
    // 方法二
    class Solution {public int searchInsert(int[] nums, int target) {if (nums == null || nums.length == 0) {return -1;}if (nums[0] > target) {return 0;}if (nums[nums.length - 1] < target) {return nums.length;}int left = 0;int right = nums.length - 1;while (left <= right) {int mid = (left + right) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
    }

这篇关于LeetCode25 搜索插入位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771278

相关文章

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p