35. 搜索插入位置 - 力扣(LeetCode)

基础知识要求:

Java:方法、while循环、if else语句、数组

Python: 方法、while循环、if else语句、列表

题目: 

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

 

示例 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

 

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

思路解析:

这个问题是一个典型的二分查找问题,但有一个额外的要求:如果目标值不存在于数组中,需要返回它应该被插入的位置。这意味着我们不仅要找到目标值是否存在于数组中,还要找到它应该被插入的位置,即使它不存在。

以下是解决这个问题的思路:

  1. 初始化搜索边界:将搜索的左边界 left 设置为数组的起始位置(索引0),将右边界 right 设置为数组的最后一个位置(索引len(nums) - 1)。

  2. 进行二分查找

    • 计算中间位置的索引 mid,使用 mid = left + (right - left) / 2(整除以避免整数溢出)。
    • 比较 nums[mid] 和 target
      • 如果 nums[mid] == target,则找到了目标值,直接返回 mid
      • 如果 nums[mid] < target,则目标值(如果存在)一定在 mid 的右侧,更新 left = mid + 1
      • 如果 nums[mid] > target,则目标值(如果存在)一定在 mid 的左侧或就是 mid(但由于我们已经检查了 mid,所以知道它不等于 target),更新 right = mid - 1
  3. 处理目标值不存在的情况

    • 如果循环结束后仍未找到目标值(即 left > right),则目标值应该被插入在 left 的位置。这是因为在最后一次迭代中,nums[mid] 必然大于 target,且 mid 被更新为了 right(即 mid - 1),而 left 保持不变。因此,left 的位置是第一个大于 target 的元素的位置,也是 target 应该被插入的位置。
  4. 返回结果:返回 left 作为结果,它要么是目标值的索引,要么是目标值应该被插入的位置。

这个算法的关键在于理解二分查找过程中如何更新 left 和 right,以及在何时知道目标值不存在于数组中,并确定其应该被插入的位置。

Java代码示例:

public class Solution {  /**  * 在有序数组中查找目标值,如果不存在则返回应该插入的位置  *  * @param nums 有序数组  * @param target 目标值  * @return 目标值的索引(如果存在),否则为应该插入的位置  */  public int searchInsert(int[] nums, int target) {  int left = 0;  // 初始化左边界为数组起始位置  int right = nums.length - 1;  // 初始化右边界为数组末尾位置  // 当左边界小于等于右边界时,进行二分查找  while (left <= right) {  // 防止溢出,计算中间索引位置  int mid = left + (right - left) / 2;  // 如果中间元素等于目标值,返回其索引  if (nums[mid] == target) {  return mid;  // 如果中间元素小于目标值,说明目标值(如果存在)一定在mid的右侧,更新左边界  } else if (nums[mid] < target) {  left = mid + 1;  // 如果中间元素大于目标值,说明目标值(如果存在)一定在mid的左侧或就是mid(但已经检查过mid不等于target),更新右边界  } else {  right = mid - 1;  }  }  // 如果循环结束,说明目标值不存在于数组中,left将会是target应该被插入的位置  // 这是因为当left > right时,left指向了下一个应该被插入的位置  return left;  }  /**  * 主方法,用于测试searchInsert方法  *  * @param args 命令行参数(本例中未使用)  */  public static void main(String[] args) {  Solution solution = new Solution();  int[] nums = {1, 3, 5, 6};  // 初始化一个有序数组  // 测试目标值为5的情况  int target = 5;  System.out.println(solution.searchInsert(nums, target)); // 输出: 2  // 测试目标值为2的情况  target = 2;  System.out.println(solution.searchInsert(nums, target)); // 输出: 1  // 测试目标值为7的情况  target = 7;  System.out.println(solution.searchInsert(nums, target)); // 输出: 4  }  
}

 

Python代码示例:

def searchInsert(nums, target):  # 初始化搜索的左右边界,left为数组的开始位置,right为数组的结束位置  left, right = 0, len(nums) - 1    # 当左边界小于等于右边界时,进行循环搜索  while left <= right:    # 计算中间索引位置  mid = (left + right) // 2    # 如果中间元素等于目标值,直接返回其索引  if nums[mid] == target:    return mid    # 如果中间元素小于目标值,说明目标值(如果存在)一定在mid的右侧,更新左边界  elif nums[mid] < target:    left = mid + 1    # 如果中间元素大于目标值,说明目标值(如果存在)一定在mid的左侧或就是mid(但已经检查过mid不等于target),更新右边界  else:    right = mid - 1    # 如果循环结束,说明目标值不存在于数组中  # 由于我们是通过 left > right 退出的循环,且最后一次比较时 nums[mid] > target  # 所以 target 应该被插入在 left 的位置(此时left是第一个大于target的元素的位置)  # 返回left作为插入位置  return left    # 测试  
nums = [1,3,5,6]    
target = 5    
print(searchInsert(nums, target))  # 输出: 2  # 目标值5在索引2处  target = 2    
print(searchInsert(nums, target))  # 输出: 1  # 目标值2应该被插入在索引1处  target = 7    
print(searchInsert(nums, target))  # 输出: 4  # 目标值7应该被插入在索引4处(数组末尾之后)

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/12479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试加分项:精通Java高并发下的锁优化策略

1. 问题背景与挑战 1.1 并发编程中的挑战 在现代软件开发中&#xff0c;高并发已成为衡量系统质量的一项关键因素&#xff0c;特别是对于那些需要同时处理数以万计甚至百万级用户请求的服务。并发编程的挑战在于如何有效地同步多个线程&#xff0c;确保数据的一致性和系统的稳…

3ds Max与Maya不同之处?两者哪个更适合云渲染?

3ds Max 和 Maya 都是知名的3D软件&#xff0c;各有其特色。3ds Max 以直观的建模和丰富的插件生态闻名&#xff1b;Maya 则在动画和角色创作方面更为出色。两者都支持云渲染技术&#xff0c;能帮助用户在云端高效完成项目。 一、3ds Max和Maya之间的主要区别&#xff1a; 3ds…

短视频的拍摄方式有哪些:四川京之华锦信息技术公司

创意与技术并存的艺术之旅 在数字媒体高速发展的今天&#xff0c;短视频已经成为人们获取信息、表达情感、展示才艺的重要窗口。从社交平台到新闻资讯&#xff0c;再到教育娱乐&#xff0c;短视频无处不在&#xff0c;其独特的魅力和广泛的传播力让人们对它的拍摄方式产生了浓…

全像宇宙投影第三部时间与空间(全文)下载

当这个人向空中凝视时&#xff0c;他所在的房间渐渐变得透明而朦胧&#xff0c;空中渐渐浮现一个久远前景像。突然他觉得自己在皇宫中庭内&#xff0c;他面前站著一位年轻女士非常美丽&#xff0c;有著橄榄色的皮肤。他可以见到她的颈项、手腕、脚踝上都挂著金饰&#xff0c;还…

df 中的 NoneType、空和 None

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 目录 简介什么是 NoneType&#xff1f;什么是空&#xff08;Empty&#xff09;&#xff1f;什么是 None&#xff1f;Python 中如何判断 NoneType&#xff1f;Pandas DataFrame 中的 NoneType、空和 None实操&#x…

RabbitMQ 面试题(五)

1. RabbitMQ如何保证消息的有序性&#xff1f; RabbitMQ本身并不直接保证消息的有序性&#xff0c;因为它是一个设计用于并发处理消息的消息中间件。然而&#xff0c;可以通过一些特定的配置和策略来尽量确保消息的有序性。以下是一些建议的方法&#xff1a; 单队列与单消费者…

django-oscar安装配置

1、创建python 虚拟环境 python3 -m venv oscar-env —创建虚拟环境 source oscar-env/bin/activate —激活环境 2、创建一个oscar文件目录 mkdir oscar; 3、生成一个商店站点 django-admin startproject ruihong; 4、完成django 配置 https://django-osca…

为什么安装了Docker后还要安装Docker Compose?

2024年5月15日&#xff0c;周三上午 安装 Docker 和 Docker Compose 是两个不同的概念&#xff0c;它们各自有不同的用途。 Docker&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后…

HIVE大数据平台SQL优化分享

相信很多小伙伴在面试的时候&#xff0c;必然跳不过去的一个问题就是SQL脚本的优化&#xff0c;这是很多面试官爱问的问题&#xff0c;也是可以证明你实力进阶的一个重要的能力。 下面给大家分享一个重量级的大数据行业sql技能---hive大数据平台SQL优化。 此文章是大数据平台…

TimesFM: 预训练的时间序列基础模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

Ajax额

原生Ajax xml 已被json取代 http 请求方法urlhttp版本号 network 谷歌浏览器查看请求报文和响应报文 F12 network header里面有 请求头 响应头 点击view source 可以查看请求响应行 请求体在请求行头下面 get请求有url参数&#xff0c;请求体变为query String…

AT32F415使用FreeRTOS笔记

1、首先下载一份源码。 2、然后按照雅特力的移植文档操作&#xff0c;freertos只有内核&#xff0c;移植起来超级简单只需要把src目录下的几个源文件、heap4和port文件添加现有工程里。将3个中断函数用_weak 改为虚函数。再添加一个配置文件FreeRTOSConfig.h就可以编译通过了。…

网络传输,请每次都开启 TCP_NODELAY

原文&#xff1a;Marc Brooker - 2024.05.09 &#xff08;注&#xff1a;不必过于担心这个问题&#xff0c;大部分现代库&#xff0c;语言&#xff08;如 Go&#xff09;&#xff0c;代理&#xff08;如 Envoy&#xff09;&#xff0c;都默认设置了 TCP_NODELAY。如果遇到网络…

AIGC数字人视频创作平台,赋能企业常态化制作数字内容营销

随着数字人技术不断发展&#xff0c;AIGC、元宇宙等相关产业迅速发展&#xff0c;企业通过3D虚拟数字人定制&#xff0c;打造出专属的数字人作为企业与用户沟通的新桥梁。 作为3D、AI数字人技术服务商及方案提供商&#xff0c;广州虚拟动力一直致力于为各领域企业通过3D虚拟数字…

Franz Electron + React 源码启动运行填坑指南

环境要求 安装miniconda python 环境electron/rebuild用得着&#xff0c;miniconda 默认自带的 python 是 3.11 版本&#xff0c;比较新&#xff1b; 安装virsual studio 2019 要把C桌面相关的都安装了&#xff0c;大概需要20G&#xff0c;不要安装到 C 盘&#xff0c;都安装到…

Rust处理命令行参数

概述 为了让我们的程序接收一系列数值作为命令行参数并打印出它们的最 大公约数&#xff0c;可以将 src/main.rs 中的 main 函数替换为以下内容&#xff1a; use std::str::FromStr; use std::env; fn main() {let mut numbers Vec::new();for arg in env::args().skip(1) {…

第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器提供静态文件

文章目录 第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器提供静态文件如果从 Web 服务器提供静态文件配置 Web 服务器路径将虚拟目录添加到 IIS将别名添加到 Apache 配置 第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器…

【C++】认识C++(上)

目录 从C到C命名空间同名冲突命名空间的定义命名空间的使用 C的输入和输出缺省参数&#xff08;默认参数&#xff09; 从C到C C语言的出现是计算机科学和工程史上的一个重要里程碑&#xff0c;许多现代计算机语言都受C语言的影响。C语言是面向过程的&#xff0c;结构化和模块化…

梯度下降算法要点和难点具体应用

梯度下降算法(Gradient Descent Algorithm)是一种常用的优化算法,用于求解机器学习和深度学习中模型参数的最优解。其基本思想是通过迭代的方式,不断地沿着函数梯度的反方向更新参数,从而逼近函数的最小值点(或最大值点,取决于问题是求最小值还是最大值)。 以下是梯度下…

PostgreSQL的表空间

PostgreSQL的表空间 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777在 PostgreSQL 中&#xff0c;表空间&…