代码随想录算符训练营第1天|LeetCode704二分查找,LeetCode27移除元素

704.二分查找

题目链接:704. 二分查找 - 力扣(LeetCode)

文档讲解:代码随想录 (programmercarl.com)

视频链接:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

状态:一刷;

1.看到题目第一思路

第一思路:设立左右指针,比较target与middle的值
if target=middle ,return middle
if target<middle,说明 left<=target<middle,更新right = middle-1,更新查找范围[left,right]
if target>middle 说明middle<target<=right,更新left=middle+1,更新查找范围[left,right] 

2.看完代码随想录想法

二分法的前提条件:有序数组,且数组无重复元素

二分法区间定义:左闭右闭[ left , right ],左闭右开[ left , right )

优化middle计算:

middle =  left+((right-left)>>1) 防止溢出,等同于(left+right)/2;

调整middle计算式的位置,放在循环里先进行计算。

判断循环条件方式:

当区间定义为[ left , right ],此时left==right依然有效,即<=

当区间定义为[ left , right ),此时left==right 无效,即<

3.实现遇到的困难

困难点:指针边界问题,查找范围为[left,right],即左闭右闭区间
初值:left=0,right=nums.length-1,middle=(left+right)>>2;
循环条件:假设数组只有一个值,则left=right=middle,那么条件为left<=right

4.代码

在更新left,right指针时要把握边界指针是否在可判定区间内

/**
 * 代码随想录左闭右闭
 */

class Solution1 {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;//定义target在左闭右闭的区间里,[left,right]
        while(left<=right){ //当left==right时,区间[left,right]依然有效,所以用<=
            int middle = left +((right-left)>>1);//防止溢出,等同于(left+right)/2;
            if(target==nums[middle])
                return middle; // 数组中直接找到目标值,返回下标
            else if(target<nums[middle]){
                right = middle-1; //target在左区间 [left,middle-1]
            }else{
                left = middle+1; //target在右区间,[middle+1,right]
            }
        }
        return -1; //遍历后找不到,返回-1
    }
}

/**
 * 代码随想录左闭右开区间
 */
class  Solution2{
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length; //定义target在左闭右开区间,[left,right),即实际查找范围是[left,right-1]
        while(left<right){ //当left==right时,[left,right)是无效区间,所以用<
            int middle = left+(right-left)>>1;
            if(target==nums[middle])
                return middle;//找到目标值target,返回下标
            else if(target<nums[middle]){
                right=middle;//target在左区间,[left,middle)
            }else{
                left=middle+1;//target在右区间,[middle+1,right)
            }
        }
        return -1;
    }
}

27.移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

文档链接:代码随想录 (programmercarl.com)

视频链接:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

状态:一刷

1.看到题目第一思路

从前往后遍历,如果num[i]==k,那么将这个元素往后的元素往前移动一个位置,覆盖掉这个元素。

引入统计相同元素k的计数变量count,返回nums.length-count

2.看完代码随想录想法

数组的特点:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

暴力法:即使是暴力算法也比我优雅的多。直接用size=nums.length就把数组的逻辑大小规定清楚了,就不用原始数组大小和count等等算边界了,遇到覆盖直接size--即可,解决逻辑缩小的问题,同时用size作为右边界即可。
在编写过程中我也考虑到了数组逻辑大小缩小,指针回退的问题,但实现起来就很惨不忍睹。

双指针法:定义快慢指针

快指针:寻找新数组的元素,新数组就是不含有目标元素的数组
慢指针:指向更新新数组下标的位置

判断条件究竟是!=还是==就有很大区别。这里用 != 逻辑更简单,只需要复制即可

3.实现遇到的困难

依旧是数组边界问题。
首先每次往左覆盖一个单位,数组大小逻辑上是减1的,也就是右边界大小-1.
所以right指针更新式为right = nums.length - count - 1;这里需要先更新式子,再count++。因为只有覆盖之后才能缩小右边界。

4.代码

class Solution2{
    public int removeElement(int[] nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0;fastIndex<nums.length;fastIndex++){//如果是剔除元素val,则fastIndex指针持续向前,直到找到不是的元素为止,复制给新数组。
            if(nums[fastIndex]!=val){//如果不是剔除元素val,那么新数组的元素复制fastIndex所指元素
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;//经过最后一次++后,slowIndex大小等于新数组大小
    }
}

35. 搜索插入位置

题目链接:35. 搜索插入位置 - 力扣(LeetCode)

文档链接:代码随想录 (programmercarl.com)

视频链接:

状态:一刷

不变量是[ left , right ]
每次循环数组大小-1,所以当left==right时不会出现死循环的情况。
正常跳出循环的条件一定是target==nums[middle],当找不到跳出循环right<left,并且差一个单位.

分别处理如下四种情况:

目标值在所有元素之前:[0 ,-1]
目标值等于数组某个元素 return middle
目标值插入数组中某个元素位置:[left right],return right+1
目标值在所有元素之后的情况[left , right] return right+1;

class Solution{
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        while(left<=right){
            int middle = left+((right-left)>>1);
            if(target==nums[middle])
                return middle;//数组中存在该数值,返回其索引
            else if (target<nums[middle]) {
                right=middle-1;//target在左区间,[left,middle-1]
            }else{
                left=middle+1;//target在右区间,[middle+1,right]
            }
        }
        return right+1;
    }
}

今日感想

学习的时候慢吞吞的,花了一下午,再写LeetCode35题时,发现还是对二分查找理解不深刻。

利用循环不变式写出正确的二分查找及其衍生算法 – KelvinMao Blog

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

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

相关文章

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

STMF4学习笔记(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

番外篇 | 斯坦福提出即插即用二阶优化器Sophia :相比Adam实现2倍加速,显著节省大语言模型训练成本

前言:Hello大家好,我是小哥谈。大模型的预训练成本巨大,优化算法的改进可以加快模型的训练时间并减少训练开销。目前大模型的训练优化器基本上都采用Adam及其变体,并且Adam的应用已经有9个年头了,在模型优化方面相当于霸主的地位。但是能否够在优化器方面提高模型预训练效…

第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题-附答案

第15届蓝桥杯Python青少组选拔赛&#xff08;STEMA&#xff09;2023年8月真题 题目总数&#xff1a; 11 总分数&#xff1a; 400 一、单选题 第 1 题 单选题 以下不符合 Python 语言变量命名规则的是&#xff08; &#xff09;。 A. k B. 2_k C. _k D. ok 答案 B …

全面解析自然语言处理(NLP):基础、挑战及应用前景

自然语言处理 (NLP) 简介与应用前景 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算语言学的一个分支&#xff0c;致力于使计算机能够理解、解释和生成人类语言。这篇博文将深入探讨自然语言处理的基础知识、挑战、典型任务及其广泛的应用前景。 一、自然语言处理的…

企业部署 LLM 的四种方法

目录 生产环境中的四种 LLM 方法1. 基于上下文的提示工程 -- Prompt Engineering2. 检索增强生成 -- RAG3. 微调模型 -- Fine Tune4. 训练模型参考随着大型语言模型 (LLM) 的快速发展,企业正积极探索其用例,并将首批生成式 AI 应用部署到生产环境中。自今年 LLM 或 LLMOps 真…

全网最详细的软件测试面试题总结+基础知识(完整版)

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

python3.8安装详细教程

python3.8下载及安装详细教程 Python 3.8 是一个重要的Python版本&#xff0c;它引入了一系列新功能和改进。以下是对Python 3.8的详细概述&#xff0c;包括其关键特性、安装方法以及版本状态等信息。 Python 3.8的关键特性 海象运算符&#xff08;Walrus Operator&#xff09…

字符串操作函数

目录 一.strlen函数 二.strcpy函数 三.strcat函数 四.strcmp函数 五.strncpy函数 六.strncat函数 七.strncmp 函数 八.strstr函数 九.strtok函数 十.strchr函数 十一.strrchr函数 十二.strpbrk函数 十三.strspn函数 十四.strcspn函数 一.strlen函数 size_t str…

yaklang window安装 vscode运行得到“hello world”

资源来源&#xff1a;旅程伊始&#xff1a;Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单&#xff0c;管理员权限打开命令行运行以下命令&#xff1a; powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

“穿越时空的机械奇观:记里鼓车的历史与科技探秘“

在人类文明的发展历程中&#xff0c;科技的创新与进步不仅仅推动了社会的进步&#xff0c;也为我们留下了丰富的文化遗产。记里鼓车&#xff0c;作为一种古老的里程计量工具&#xff0c;其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理…

MySQL数据库设计作业 ——《网上书店系统》数据库设计实验报告

数据库设计作业——《网上书店系统》数据库设计 一、功能需求 普通用户&#xff1a;可以进行最基础的登陆操作&#xff0c;可浏览图书、按类别查询图书、查看 图书的详细信息&#xff0c;还可以注册成为会员。会员&#xff1a;需要填写详细信息&#xff08;真实姓名、性别、手…

SSM学习4:spring整合mybatis、spring整合Junit

spring整合mybatis 之前的内容是有service层&#xff08;业务实现层&#xff09;、dao层&#xff08;操作数据库&#xff09;&#xff0c;现在新添加一个domain&#xff08;与业务相关的实体类&#xff09; 依赖配置 pom.xml <?xml version"1.0" encoding&quo…

springboot+vue+mybatis企业保修系统+PPT+论文+讲解+售后

企业管理系统提供给用户一个企业信息管理的系统&#xff0c;最新的企业信息让用户及时了解企业管理动向,,还能通过交流区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、员工和主管三个部分&#…

【C语言】手撕结构体内存对齐

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 结构体对齐规则结构体大小计算 - 三步曲 结构体对齐规则 怎么计算结构体的内存大小。这就涉及到结构体内存对齐的问题。 结构体的第⼀个成员对⻬到…

项目实战--MySQL实现分词模糊匹配

一、需求描述 推广人员添加公司到系统时&#xff0c;直接填写公司简称&#xff0c;而公司全称可能之前已经被添加过&#xff0c;为防止添加重复的公司&#xff0c;所以管理员在针对公司信息审批之前&#xff0c;需要查看以往添加的公司信息里是否有相同公司。 二、方案 技术…

项目2:API Hunter 细节回顾 -1

一. 接口调用 对于开发者来说&#xff0c;接口的调用应当是方便快捷的&#xff0c;而且出于安全考虑&#xff0c;通常会选择在后端调用第三方 API&#xff0c;避免在前端暴露诸如密码的敏感信息。 若采用 HTTP 调用方式&#xff1a; HttpClientRestTemplate第三方库&#xf…

【JavaWeb】登录校验-会话技术(一)Cookie与Session

登录校验 实现登陆后才能访问后端系统页面&#xff0c;不登陆则跳转登陆页面进行登陆。 首先我们在宏观上先有一个认知&#xff1a; HTTP协议是无状态协议。即每一次请求都是独立的&#xff0c;下一次请求并不会携带上一次请求的数据。 因此当我们通过浏览器访问登录后&#…

py黑帽子学习笔记_burp

配置burp kali虚机默认装好了社区版burp和java&#xff0c;其他os需要手动装 burp是用java&#xff0c;还得下载一个jython包&#xff0c;供burp用 配apt国内源&#xff0c;然后apt install jython --download-only&#xff0c;会只下载包而不安装&#xff0c;下载的目录搜一…