力扣刷题--数组--第一天

一、数组

数组特点:

  • 连续内存空间
  • 存储得数据元素类型一致
  • 数组可以通过下标索引查找数据元素,可以删除、替换、添加元素等

1.1 二分查找

使用二分查找需满足得条件:

  • 数组是有序的;
  • 数组中没有重复元素;
  • 查找的target是唯一的。
  • 注意写代码时数组左右区间。
  1. 题目链接
      给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
    python:
# [left,right]查找区间是左闭右闭
class Solution:def search(self, nums: List[int], target: int) -> int:def run(lindex,rindex):if lindex > rindex:return -1mid=lindex+(rindex-lindex)//2if nums[mid] == target:return midelif nums[mid] > target:rindex=mid-1else:lindex=mid+1return run(lindex,rindex)return run(0,len(nums)-1)

c++版代码:

class Solution {
public:int search(vector<int>& nums, int target) {int lindex=0;int rindex=nums.size()-1;while(lindex <= rindex){int mid=lindex+(rindex-lindex)/2;if(nums[mid] > target)rindex=mid-1;else if(nums[mid] < target)lindex=mid+1;elsereturn mid;}return -1;}
};
  1. 题目链接
      给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
    请必须使用时间复杂度为 O(log n) 的算法
    暴力解法
class Solution:def searchInsert(self, nums: List[int], target: int) -> int:for i in range(len(nums)):# 因为nums是升序数组,故出现的第一个大于或等于target的索引满足条件if nums[i]>=target:return i# 若上述均不满足,说明target大于nums数组全部元素# 故将target插到数组尾部return len(nums) 

二分查找
  首先下述讨论均以左闭右闭区间为例。设定lindex、rindex、mid分别为左边索引、右边索引、中间索引,根据二分查找规则,若数组中没有target,则有lindex>rindex,且lindex=rindex+1。
  根据题意,可分为四种情况:
  (1) 若target小于数组全部元素,故lindex不更新,lindex=0,rindex最终为-1,target插入的索引为0;
  (2) 若target大于数组全部元素,则rindex不更新,rindex=n-1,lindex最终更新的n,target插入的索引为n;
  (3) 若target等于数组中某个元素,则根据二分查找规则,直接返回mid索引即可;
  (4) 若target需插入数组中某个位置,根据上述暴力求解法可以看出,target肯定会插在第一个大于target的索引位置上。根据左闭右闭区间规则,最终target因为不在数组中,则有lindex>rindex跳出循环,此时看下图可知,lidnex左侧的元素必定小于target,则lindex是第一个大于target的索引;从rindex角度来看,rindex右侧的元素必定大于target,故lindex是第一个大于target的索引。故target插入的索引为lindex或者是rindex+1;
在这里插入图片描述

图像参考自https://leetcode.cn/circle/discuss/ooxfo8/

代码:

# [left,right]
class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# [lindex,rindex]lindex=0rindex=len(nums)-1while lindex <= rindex:mid=lindex+(rindex-lindex)//2if nums[mid] > target:rindex=mid-1elif nums[mid] < target:lindex=mid+1else:return midreturn lindex  # rindex+1

总结

  1. 目前只关注二分查找左闭右闭区间情况,怕与其他情况弄混。之后熟悉了可以再看其他解法;
  2. 第2题对于最终返回的是lindex或者rindex+1,我困惑许久,不太懂为何会是这样的结果。究其根本还是对二分查找算法不够理解,经过多方查找资料才对上述结果有了一定的理解。
    在这里插入图片描述
图像参考自https://leetcode.cn/circle/discuss/ooxfo8/

有如下结论:对于左闭右闭区间情况,

  • 初始状态:lindex=0,rindex=n-1;
  • 循环条件:lindex<=rindex;
  • 中间值索引:mid=lindex+(rindex-lindex)//2;
  • nums[mid] > target, update>> rindex=mid-1;
  • nums[mid] < target, update>> lindex=mid+1;
  • 满足条件:return mid;
  • 跳出循环:lindex>rindex 且 lindex=rindex+1;

参考:

  1. https://www.programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%9D%E8%B7%AF
  2. https://programmercarl.com/0035.%E6%90%9C%E7%B4%A2%E6%8F%92%E5%85%A5%E4%BD%8D%E7%BD%AE.html#%E6%80%9D%E8%B7%AF
  3. https://leetcode.cn/circle/discuss/ooxfo8/

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

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

相关文章

Rust教程:贪吃蛇游戏(第 1/2 部分)

Its excited to show you how to code the “Snake Game” in Rust! I feel that Snake is the perfect program to showcase your skills. This Snake game has multiple different components. 本文将向您展示如何用 Rust 编写“贪吃蛇游戏”&#xff01;我觉得贪吃蛇游戏是展…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

暗区突围进不去/游戏无法启动/掉帧卡顿/报错的解决方法

暗区突围是一款高拟真硬核射击手游&#xff0c;打造了全新的沉浸式暗区战局体验&#xff0c;发行商是腾讯公司。这个游戏名词虽然看起来有些陌生&#xff0c;但其本身的玩法内核毫无疑问的是&#xff0c;这款游戏在画面质量和枪械操作方面&#xff0c;都是手游市场上同类游戏中…

springboot模块以及非springboot模块构成的多模块maven项目最佳构建方式

文章目录 背景一般的实现使用spring-boot-dependencies 更优雅的实现. 背景 有时候构建一个多模块maven项目其中某一个模块是web-service需要使用spring boot,其他模块跟spring boot 完全无关,本文总结一下在这个场景下maven项目最佳构建方式. 一般的实现 网上应该也看到过很…

scp传输显示进度条

在使用scp&#xff08;Secure Copy&#xff09;命令传输文件时&#xff0c;如果你想看到传输进度条&#xff0c;可以使用-v&#xff08;verbose&#xff0c;详细模式&#xff09;或-P&#xff08;progress&#xff09;选项。不过&#xff0c;scp的标准版本通常只提供简单的进度…

我独自升级崛起下载教程 我独自升级崛起怎么一键下载

定于5月8日全球盛大发布的动作RPG力作《我独自升级崛起》&#xff0c;基于备受追捧的同名动画及网络漫画&#xff0c;誓为热情洋溢的游戏爱好者们呈献一场深度与广度兼具的冒险盛宴。这款游戏巧妙融合网络武侠元素&#xff0c;其创意十足的设计框架下&#xff0c;核心叙述聚焦于…

记录一次给PCAN升级固件pcan_canable_hw-449dc73.bin

方法一:网页升级 首先将3.3V与BOOT短接,插入电脑USB接口,识别为STM32 BOOTLOADER,芯片进入DFU模式。 如果电脑没有识别到STM32 BOOTLOADER,或无法驱动,则需要安装ImpulseRC_Driver_Fixer修复工具。 推荐使用Google浏览器打开网页升级选择PCAN固件,点Connect and Update,…

学习Python的第4天:函数与模块的高级应用

经过前三天的Python学习&#xff0c;我们已经掌握了Python的基础知识&#xff0c;包括数据类型、控制结构以及基本的编程实践。今天&#xff0c;我们将进一步探索Python的函数与模块的高级应用&#xff0c;以提升我们的编程能力。 1. 函数的高级应用 函数是Python中组织代码的…

一部手机实现全行业的AI实景自动无人直播软件:为商家提供更便捷的推广方式

随着人工智能技术的快速发展&#xff0c;AI实景自动无人直播软件成为了商家推广产品的新宠。这款软件结合了智能讲解、一键开播、智能回复等多项功能&#xff0c;为商家提供了一种全新的直播方式。 首先&#xff0c;智能讲解功能让专业主播录制直播脚本&#xff0c;并通过软件自…

如何从零开始学习数据结构?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;数据结构 算法&#xff1d;程…

Navicat Data Modeler Ess for Mac:强大的数据库建模设计软件

Navicat Data Modeler Ess for Mac是一款专为Mac用户设计的数据库建模与设计工具&#xff0c;凭借其强大的功能和直观的界面&#xff0c;帮助用户轻松构建和管理复杂的数据库模型。 Navicat Data Modeler Ess for Mac v3.3.17中文直装版下载 这款软件支持多种数据库系统&#x…

MySQL之查询 拿下 * 。*

DQL数据查询语言 对上述的的查询操作进行代码演示&#xff08;续上一篇学生表代码进行处理&#xff09; 下面是上一篇的代码分享 下面进行简单的查询操作 字符串如果强行进行算数运算默认只为0 查询时常用的单行函数列举 未完待续

极狐GitLab 16.11 重磅发布,更多关于 DevSecOps 的功能更新【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

什么牌子的骨传导耳机质量好?五大宝藏热门机型测评对比!

我作为一名音乐发烧友&#xff0c;对各类耳机产品都有深入的了解&#xff0c;最近也经常被人问及骨传导耳机哪个牌子好。通过交流&#xff0c;我发现很多人在选择骨传导耳机的时候&#xff0c;都有出现踩坑的情况&#xff0c;这也难怪&#xff0c;随着骨传导耳机热度逐渐增加&a…

将 对象数组 按 对象指定字段 分类为二维数字

例如&#xff1a; arr[ {name:a,age:1}, {name:b,age:2}, {name:c,age:3}, {name:d,age:1}, {name:e,age:1}, {name:f,age:2}, ] 处理结果&#xff1a;sortArr(arr,age) arr[ [{name:a,age:1}, {name:d,age:1},{name:e,age:1}], [{name:b,age:2},{name:f,age:2}], [{name:c,age…

Google搜索广告怎么开户?谷歌广告开户投放引流技巧、账户搭建、谷歌ads广告推广投放策略 #搜索引擎 #谷歌广告#互联网营销

Google搜索广告开户步骤&#xff1a; 选择代理商&#xff1a;首先&#xff0c;您需要选择一个经验丰富、信誉良好的Google广告代理商。可以选择上海上弦来广告开户和代运营。 初步咨询&#xff1a;与代理商进行初步沟通&#xff0c;了解他们的服务内容、成功案例、收费标准等。…

解锁程序员的实用神器:提升效率的工具与技巧--入门篇

作为一名程序员&#xff0c;我们时常需要处理繁重的任务、解决复杂的问题&#xff0c;而在这个过程中&#xff0c;合适的工具和技巧可以事半功倍地提升我们的效率和工作质量。本文将介绍一些实用的工具与技巧&#xff0c;帮助程序员们更高效地进行编码、调试和团队协作。 1. 版…

RCLAMP0854P.TCT ESD抑制器 静电和浪涌保护 应用领域

RCLAMP0854P.TCT 是一款电路保护器件&#xff0c;属于Transient Voltage Suppressor (TVS) 系列产品。它是一种低电容TVS阵列&#xff0c;具有 RailClamp 标志性技术&#xff0c;旨在为电子设备提供高效防护&#xff0c;免受高电压瞬变和静电放电&#xff08;ESD&#xff09;的…

22_Scala集合Seq

文章目录 Seq序列1.构建集合2.List集合元素拼接&&集合拼接3.可变Seq&&List3.1 ListBuffer创建3.2 增删改查3.3 相互转化 Appendix1.Scala起别名2.Seq底层3.关于运算符操作: :4.空集合的表示 Seq序列 –Seq表示有序&#xff0c;数据可重复的集合 1.构建集合 …

一致性评价政策加速行业仿制药洗牌,惯爱为代表的新锐品牌崭露头角

从印度神油到以形补形&#xff0c;男人的问题&#xff0c;从古至今一直困扰着很多人&#xff0c;大多人都羞于启齿。然而&#xff0c;沉默的背后&#xff0c;隐藏着令人震惊的数据&#xff1a;据统计显示&#xff0c;ED&#xff08;勃起功能障碍&#xff09;是男性生殖系统发病…