力扣——数组(一)

news/2024/12/23 1:29:51/

一、二分法(有序数组)

1、搜索等于target的元素

 法一:

直接遍历

class Solution {
public:int search(vector<int>& nums, int target) {int i=0;for(i=0;i<nums.size();i++){if(nums[i]==target){return i;}}return -1;}
};

法二:

二分查找(前提:数组已经是升序排序

1、设left、right、middle 

2、让target和nums[middle]比较,分类讨论

3、移动左边界或右边界

class Solution{
public:
int search(vector<int>& nums, int target) {int left=0,right=nums.size()-1; //1 设置左、右、中间变量int middle=(left+right)/2while(left<=right){int middle=(left+right)/2;if(target<nums[middle]){  //2 target与中间值比较并分类讨论:比中间值大还是小还是相等right=middle-1;  //target偏小则right左移}else if(target>nums[middle]){left=middle+1; //target偏大则left右移}else{return middle; //相等则返回当前下标middle}}return -1;
}
};

注意:如果是[ ],则

1、左右边界初始值:left=0,right=nums.size()-1

2、循环条件:while(left<=right) left==right时[left,right]仍有意义

3、移动边界:因为已经明确nums[middle]不等于target,所以应让left=middle+1,right=middle-1

如果是[ ),则

1、左右边界初始值:left=0,right=nums.size()

2、循环条件:while(left<right) left==right时[left,right)没有意义

3、移动边界:因为已经明确nums[middle]不等于target,所以应让left=middle+1,right=middle

2、搜索等于target的元素或target的插入位置 

有序数组,可以使用二分法 

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left=0,right=nums.size()-1;while(left<=right){int middle=(left+right)/2;if(target==nums[middle]){return middle;}else if(target<nums[middle]){right=middle-1;}else{left=middle+1;}}return left; //找不到目标值则返回插入位置,经推算插入位置就是left}
};

 注意:如果找不到等于target的值,则要考虑三种插入情况

插入在数组之前、数组之后、数组之中

举个最简单的例子来推算:比如[0],left=right=middle=0

target=-100时,right左移,最终right=-1,left=0,而插入位置是0

target=100时,left右移,最终left=1,right=0,而插入位置是1

综上,猜测插入位置就是left0

再看[0,4],target=3时,插入位置也是left

或者直接想,最终状态是nums[right],target,nums[left],所以把target插在left的位置

二、双指针原地操作数组

1、移除等于val的元素

法一: 双指针法

i遍历整个数组,res记录保留下来的数组,都在原地操作

class Solution {
public:int removeElement(vector<int>& nums, int val) {int res=0;for(int i=0;i<nums.size();i++){if(nums[i]!=val){ //如果不等于val,则保留该数组元素(记录下来,在原地数组)nums[res++]=nums[i];}}return res;}
};

 法二:有出错的先让后面的来找补

class Solution {
public:int removeElement(vector<int>& nums, int val) {//如果前面有等于val的值,则用后面的值来替补int left=0,right=nums.size()-1;while(left<=right){if(nums[left]==val){ //nums[left]等于val,则让nums[right]来替补(有出错的先让后面的来找补)nums[left]=nums[right--];}else{left++; //nums[left]不等于val,则left继续前行}}return left;}
};

2、移除重复项 

class Solution {
public:int removeDuplicates(vector<int>& nums) {int res=0;for(int i=0;i<nums.size();i++){if(i==0||nums[i]!=nums[i-1]){ //如果当前元素不等于前一个元素,说明无重复,录入//(注意:讨论没有前一个元素的情况)nums[res++]=nums[i];}}return res;}
};

 

 


http://www.ppmy.cn/news/1517562.html

相关文章

【C++第十五章】继承

【C第十五章】继承 定义&#x1f9d0; 继承是C面向对象编程中的一个核心概念&#xff0c;它允许创建一个新类&#xff08;称为派生类或子类&#xff09;从已有类&#xff08;称为基类或父类&#xff09;中继承属性和方法。 继承的主要用途包括&#xff1a; 代码重用&#xff1…

U盘读不出来怎么办

目录 一、检查物理连接 1. 重新插拔U盘 2. 检查U盘外观 二、软件设置检查 1. 取消隐藏U盘 2. 更新或重新安装U盘驱动 3. 检查磁盘管理 三、文件系统修复 1. 格式化U盘 2. 使用命令提示符修复 四、病毒扫描 五、其他注意事项 一、检查物理连接 1. 重新插拔U盘 最简单也…

RTC相关

RTC唤醒 &#xff08;Real Time Clock) sudo rtcwake -m [mode] -s [seconds]-m 选项指定进入的电源管理模式&#xff0c;可以是&#xff1a; standby&#xff1a;进入待机模式 freeze&#xff1a;冻结模式 mem&#xff1a;挂起到内存 disk&#xff1a;挂起到磁盘 off&#xf…

AI产品经理学习路线【2024最新】,从零基础到精通,非常详细收藏我这一篇就够了

成为一名优秀的AI产品经理不仅需要掌握相关的技术知识&#xff0c;还需要具备良好的产品思维、市场洞察力以及跨部门沟通协调能力。下面是一个详细的AI产品经理学习路线&#xff0c;旨在帮助有志于从事该职业的人士快速成长。 AI产品经理的学习路线 第一阶段&#xff1a;基础知…

一篇讲完自动化基础-Python【万字详细讲解】

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 这篇文章主要学习Python的语法&#xff0c;为后续的自动化打基础 Python requests 接口自动化 Python selenium web 自动化 Python appium移动端自动化(手机 app) 这篇文章分六个阶段百分比进行划分&#xff0c;到时…

基于伏图的汽车发动机曲轴模态仿真APP应用介绍

汽车发动机是为汽车提供动力的装置&#xff0c;是汽车的心脏&#xff0c;决定着汽车的动力性、经济性、稳定性、舒适性和环保性。曲轴是发动机中最重要、承载最复杂的零件之一&#xff0c;其强度和振动特性都会影响到整机的工作性能。 汽车发动机剖面图 曲轴在运转时&#xff…

您应该让 ChatGPT 控制您的浏览器吗?

本文: 介绍授予大型语言模型 (LLM) 对 Web 浏览器的控制权的安全风险,重点关注提示注入漏洞。 通过两种场景演示了使用 Taxy AI(一种代表性概念验证浏览器代理)的利用,攻击者设法劫持代理并 (1) 从用户邮箱中窃取机密信息,(2) 强制合并 GitHub 存储库上的恶意拉取请求。 …

USB:USB历史以及概况

USB:USB历史 USB历史USB概况 USB历史 USB 是一种行业标准&#xff0c;用于将电子外围设备&#xff08;例如&#xff1a;键盘、鼠标、调制解调器和硬盘驱动器&#xff09;连接到计算机上&#xff0c;它代替了尺寸大且速度慢的连接&#xff08;例如&#xff1a;串行和并行端口&a…