【Leetcode每日一刷】数组|704. 二分查找、27. 移除元素

力扣每日刷题

  • 一、704. 二分查找
    • 1.1、题目
    • 1.2、解题思路
    • 1.3、代码实现——C++
    • 1.4、 总结&易错
  • 二、27. 移除元素
    • 2.1:题目
    • 2.2、解题思路
    • 2.3、代码实现——C++
    • 1.4、 总结&易错

一、704. 二分查找

1.1、题目

704. 二分查找
在这里插入图片描述

1.2、解题思路

  • 题型:数组、二分查找(变式)—寻找第1个大于等于目标值的元素

  • 关键:二分查找的关键点就是—两边夹(高数上又叫作夹逼准则)。left和right确定答案所在区间,通过mid(把区间划分为[left,mid]&[mid+1,right]两个区间)来缩小区间范围,直到left==right,即获得答案。

    • 为什么呢?存在如下定理:A <= target <= B,当A = B时,target = A = B
  • 思路
    1.确定答案可能取值区间[left, right]
    2.left = 0;right = nums.size()-1;
    (因为此题中array.length也有可能为答案)
    3.while(left<right)(不考虑所谓的什么闭区间,就仅仅代表它本身的含义:当left==right时,即找到答案,跳出循环

    • 为什么呢?因为很多问题就这么设计,一定要等到最后才能确定问题的答案,在很多时候,不能在循环体中找到答案。

    4.确定循环体中分支的两种情况:

    • a.target>array[mid]:left=mid+1
    • b.else (即target<=array[mid]):right=mid

    5.left==right跳出循环体后:return array[right] == targer?right : -1;
    🌟为什么呢直接return left/right呢?我们来分析一下跳出循环后的两种情况

    • 情况1:最简单的一种情况,即夹逼准则成立时,找到答案:array[left]=array[right]=targer,这个很好理解。此时array[left]==targert
    • 情况2:即没找到与target相等的元素的下标。因为array[left]<=target<=array[right]是默认恒成立的–即target应该存在于这个区间。即left指针指向[left,right]最后一个小于等于target的元素right指针指向[left,right]第一个大于等于target的元素。在[left,right]实际区间范围不断缩小的过程中,当left和right重合时,right指向的是[0,array.length-1]这个区间第一个大于等于target的元素.(我个人目前觉得在理解层面上,return right比return left要好理解一些,虽然两者达到的效果是一样的)

1.3、代码实现——C++

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

1.4、 总结&易错

  • 【易错】二分查找的重点就划分区间、逐渐缩小、两边夹,关于划分区间这题第二个代码我用的划分为[left,mid]和[mid+1,right],为什么不是**[left,mid-1][mid,right]**呢?—因为会容易出现死循环

在这里插入图片描述

使用[left, mid-1][mid, right]划分区间的代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        int mid = 0;
        while(left < right){
            int mid = left + ((right - left + 1) >> 1);
            if(target >= nums[mid]) left = mid;
            else right = mid - 1;
        }
        return nums[right] == target ? right : -1;
    }
};
  • 【重点】二分法的关键是缩小区间,死循环发生的原因是某次循环没有缩小区间导致二分失败。

  • 【重点】此题right设置为array.length的原因是array.length也有可能是问题答案

  • 【重点】二分查找的判断条件写成while(left<right),代表的是搜索区间为[left,right],一旦left==right,即此时找到问题答案,立即跳出循环。

  • 【重点】循环不变量:在[left,right]搜索答案

  • 【重点】防止溢出:int mid = left + ((right - left) >> 1)/int mid = left + ((right - left + 1) >> 1)

二、27. 移除元素

2.1:题目

在这里插入图片描述

2.2、解题思路

这题我的想法是运用双指针:

  • 左指针负责从左往右遍历,若遇到等于val的元素,停下
    • 此时右指针从右往左遍历,若遇到非val元素:将其赋值给左指针处。
  • 左指针负责保证新数组为非val元素
  • 右指针保证能将右侧的非val元素填充到左指针当前检测到的val元素处
  • 当左右指针相等,说明左指针(包括左指针)往左即为新数组。
    在这里插入图片描述

2.3、代码实现——C++

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        int right = nums.size() - 1;
        while ( left <= right){
            if (nums[left] == val){
                while(nums[right] == val && right > left){
                    right --;
                }
                if(nums[right] != val){
                    //右指针找到一个非val值,并赋值给left指针所在位置
                    nums [left] = nums[right];
                    right --;
                }else{
                    break;
                }
            }
            left ++;
        }
        return left; //因为返回的是长度,所以+1
    }
};

1.4、 总结&易错

  • 【易错】这题的易错点在于:在右指针向左探测,寻找非val元素时,它不一定找得到!!!当找不到时,说明此时左指针以左已经完全没有val元素,左指针和右指针之间也没有非val元素,此时就直接可以break跳出循环,结束了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java工程师面试简历模板,2024谈一下当下最合适的Java架构

前言 这些算法&#xff0c;都是小编一点一点看的大佬们的方法&#xff0c;自己积累的. 如果有什么描述的不对的地方还望大佬赐教 多交流才能进步&#xff0c;加油&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、冒泡排序 二、选择排序 三、插入排序 四、快速…

【C++】递归 1241 - 角谷猜想 1108 - 正整数N转换成一个二进制数

文章目录 一、问题&#xff1a;1241 - 角谷猜想二、问题&#xff1a;1108 - 正整数N转换成一个二进制数三、总结四、感谢 一、问题&#xff1a;1241 - 角谷猜想 类型&#xff1a;有规律的循环、递归。 题目描述&#xff1a; 日本一位中学生发现一个奇妙的定理&#xff0c;请角…

Android岗大厂面试官常问的那些问题,2024年Android者未来的出路在哪里

前言 伟人曾经说过&#xff1a; 书是人类进步的阶梯 书中自有黄金屋&#xff0c;书中自有颜如玉 读书破万卷&#xff0c;下笔如有神 书是唯一不死的东西。 书籍是伟大的天才留给人类的遗产。 最近有很多朋友在我的公众号上提问“Android开发的经典入门教材和学习路线&#xff…

数据结构->链表分类与oj(题),带你提升代码好感

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 1.&#x1f34e;链表的分类 前面我们学过顺序表&#xff0c;顺序表问题&#xff1a; …

redis IO多路复用模型详解

一、IO 1.1、IO模型 我们常说的IO&#xff0c;指的是文件的输入和输出 &#xff0c;但是在操作系统层面是如何定义IO的呢&#xff1f;到底什么样的过程可以叫做是一次IO呢&#xff1f; 拿一次磁盘文件读取为例&#xff0c;我们要读取的文件是存储在磁盘上的&#xff0c;我们的…

window环境下使用k8s部署.net core项目

前提&#xff1a;已经部署镜像到Docker 在项目发布目录下新建.yaml文件&#xff0c;内容如下&#xff08;以下仅举例出两种方式内容&#xff0c;可按需自由配置&#xff09; --方式一(创建deployment 、服务、指定命名空间) # ------------------- 注意层级结构&#xff0c;…

【debug】element-ui时间控件回显后不可编辑且显示为空

问题&#xff1a;使用element-ui的时间控件回显数据&#xff0c;编辑数据没有反应&#xff1a;点时间和“确认”按钮都没反应。 输入框中会显示数据&#xff0c;但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…

激光炸弹 刷题笔记

前置知识 二维前缀和 子矩阵的和 刷题笔记 {二维前缀和}-CSDN博客 思路 参考二维前缀和 将子矩阵的和 做成动态矩阵 一个个矩阵搜索 符合要求边长 矩阵中的元素和最大值 将x1,y1用i-k,j-k表示即可 x2,y2用i&#xff0c;j表示 代码 #include<iostream> #include<…

【定岗定编】某度假村酒店客房部定岗定编管理咨询项目纪实

该度假村酒店由于地域广阔&#xff0c;将客服部分为了四个不同区域&#xff0c;这样就导致了在不同的区域员工的接待量不均衡的状况&#xff0c;引起了员工的强烈不满。如何合理地配置客户部人员以及如何合理地鉴定员工的工作量成为该酒店所面临的两大难题。让我们来看看在人力…

【Linux】软件包管理器yum

目录 一、yum是什么&#xff1f; 二、查看软件包 三、安装与卸载软件 1、如何安装软件 2、如何卸载软件 四、yum源的配置 一、yum是什么&#xff1f; 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人…

2024作品集流行封面设计技巧

本期不是关于如何安排作品集&#xff0c;而是关于目前国内市场上流行的作品集封面风格有哪些&#xff1f;如何实现&#xff1f;今天给大家带来了 5 种作品集设计风格&#xff0c;毛玻璃、弥散光、3D、插画、其他&#xff0c;一起往下看吧&#xff01; 毛玻璃 目前许多设计师都…

学习统一的Hyper - network用于多模态MR图像合成和缺失模态的肿瘤分割

Learning Unified Hyper-Network for Multi-Modal MR Image Synthesis and Tumor Segmentation With Missing Modalities Learning Unified Hyper-Network for Multi-Modal MR Image Synthesis and Tumor Segmentation With Missing Modalities背景贡献实验方法多模态合成方法超…

软件测试实战,Web项目网页bug定位详细分析总结(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、前置条件 1&a…

3.5日常学习

matlab处理数据 自己写了关于detect_data的函数&#xff0c;让它帮我改了&#xff0c;哈哈哈 %改正前function data_chuli(path1,savepath)[num]xlsread(path1,1,B18:F23);a num;ba;cb(:);xlswrite(savepath,c) end%改正后function data_chuli(path1, savepath)num xlsread…

05-调用API

上一篇&#xff1a; 04-JNI函数 调用 API 允许软件供应商将 Java VM 加载到任意本地应用程序中。供应商可以提供支持 Java 的应用程序&#xff0c;而无需链接 Java VM 源代码。 5.1 概述 下面的代码示例说明了如何使用调用 API 中的函数。在这个示例中&#xff0c;C 代码创建了…

鸿蒙NEXT开发实战:【视频文件裁剪】

使用OpenHarmony系统提供的ffmpeg三方库的能力在系统中实现了音视频文件裁剪的功能&#xff0c;并通过NAPI提供给上层应用调用。 基础信息 视频文件裁剪 简介 在OpenHarmony系统整个框架中有很多子系统&#xff0c;其中多媒体子系统是OpenHarmony比较重要的一个子系统&#…

selenium爬取空气质量数据

https://www.aqistudy.cn/ 爬取指定城市在指定时间范围内的空气质量数据&#xff0c;并将数据保存为CSV文件。它首先从两个文本文件中读取城市信息和代理IP信息&#xff0c;然后提示用户输入爬取的起始年份、结束年份、起始月份和结束月份。接下来&#xff0c;它启动了Chrome浏…

【Leetcode】3028.边界上的蚂蚁

题目描述 思路 题目中要求我们返回 蚂蚁返回到边界的次数。简单来想&#xff0c;就是蚂蚁原来的位置的一维坐标为0&#xff0c;然后经过&#xff0c;若干次移动&#xff0c;统计有几次坐标再次变为0的个数。 我们利用前缀和&#xff0c;像定义一个数组&#xff0c;算出前缀和数…

华为交换机vlan实验

一、目标 实现不同vlan之间的终端通信 二、命令学习 1.创建2个vlan # 进入系统视图 sy# 创建vlan vlan 10 vlan 202.查看vlan # 2.查看vlan display vlanThe total number of vlans is : 3 ---------------------------------------------------------------------------…

如何选择阿里云服务器配置?(CPU/内存/带宽/磁盘)

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…
最新文章