day01 二分,移除元素

题目链接:leetcode704-二分查找, leetcode27-移除元素

二分

注意事项:开闭区间
如果右闭,则right=len(nums)-1, for left <= right {}, right=mid-1
如果右开,则right=len(nums),  for left < right {},  right=mid

Go

左开右闭合: [left, right]

func search(nums []int, target int) int {left, right := 0, len(nums)-1mid := 0for left <= right {mid = ((right - left) >> 1) + leftif nums[mid] < target {// 说明target在mid右边,mid向右边移动left = mid + 1} else if nums[mid] > target {// 说明target在mid左边,mid向左边移动right = mid - 1} else {return mid}}return -1
}

左闭右开:[left, right)

func search(nums []int, target int) int {left, right := 0, len(nums)mid := 0for left < right {mid = ((right - left) >> 1) + leftif nums[mid] < target {// 说明target在mid右边, mid右边移动left = mid + 1} else if nums[mid] > target {// 说明target在mid左边,mid左边移动right = mid} else {return mid}}return -1
}

Rust

左开右闭合: [left, right]
之所以使用i32是因为当mid为0时, mid-1会报错(Vector的索引是usize类型)

	pub fn search(nums: Vec<i32>, target: i32) -> i32 {let (mut left, mut right, mut mid) = (0, (nums.len() - 1) as i32, 0);while left <= right {mid = ((right - left) >> 1) + left;if nums[mid as usize] < target {// 说明target在右区间left = mid+1;} else if nums[mid as usize] > target {// 说明target在左边区间right = mid -1 ;} else {return mid as i32;}}return -1;}

左闭右开:[left, right)

	pub fn search(nums: Vec<i32>, target: i32) -> i32 {let (mut left, mut right, mut mid) = (0usize, nums.len() - 1, 0usize);while left < right {mid = ((right - left) >> 1) + left;if nums[mid] < target {// 说明target在右区间left = mid+1;} else if nums[mid] > target {// 说明target在左边区间right = mid;} else {return mid as i32;}}return -1;}

移除元素

数组的长度是固定的,无法进行删除,所谓的元素删除也只是将目标val移动到数组的末尾作为无效的值,同时对数组中有效值的数量进行标识,如数组所允许访问的索引范围为[0, 有效值的数量)。

Go

双指针法,不再关系无效的val,让有效的val从索引为0开始重组数组(无效的值会被覆盖,不再关心)
如果不想无效的val被覆盖,可以参考相向双指针法,将无效的val全都移动到数组的尾部

func removeElement(nums []int, val int) int {idx, numLen := 0, len(nums)for fast := 0; fast < numLen; fast++ {if nums[fast] == val {continue}nums[idx] = nums[fast]idx++}return idx
}

相向双指针法,将无效的val全都移动到数组的尾部, 但是数组中的值的顺序会发生变化
基本思路:

  1. 存在双指针:left, right,left从索引为0的位置向数组尾部移动,right从索引为len(nums)-1的位置开始向数组头部移动
  2. 让left发现指定的val,停止不动,当right发现非指定的val,停止不动
  3. 交换left和right所指向的值
  4. 重复2,3过程,直到left > right跳出循环
func removeElement(nums []int, val int) int {left, right := 0, len(nums)-1for left <= right {// left指向val的位置for left <= right && nums[left] != val {left++}// right指向非val的位置for left <= right && nums[right] == val {right--}// 如果移动之后依旧满足left < right, 则交换left和right所指向的值if left > right {break}nums[left], nums[right] = nums[right], nums[left]left++right--}return left
}

Rust

双指针法

	pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {let mut slow = 0usize;for fast in (0..nums.len()) {if nums[fast] == val {continue}nums[slow] = nums[fast];slow += 1;}slow as i32}

相向双指针

	pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {let (mut left, mut right) = (0 , nums.len() as i32 - 1);while left <= right {// left指向val的位置while left <= right && nums[left as usize] != val {left += 1;}// right指向非val的位置while left <= right && nums[right as usize] == val {// 使用uize,这里可能会报错right -= 1;}if left > right {break}// 交换值(nums[left as usize], nums[right as usize]) = (nums[right as usize], nums[left as usize]);left += 1;right -= 1;}left}

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

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

相关文章

Conda python运行的包和环境管理 入门

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装 Conda 是一个功能强大的命令行工具&#xff0c;用于在 Windows、macOS 和 Linux 上运行的包和环境管理。 本 conda 入门指南介绍了启动和使用 conda 创建环境和安装包的基础知识。 1. 准备…

解决Android Studio gradle下载超时和缓慢问题(win10)

解决超时问题 一般配置阿里云代理就可以解决。 具体配置方法&#xff0c;参考&#xff1a;https://blog.csdn.net/zhangjin1120/article/details/121739782 解决下载缓慢问题 直接去腾讯云镜像下载&#xff1a; https://mirrors.cloud.tencent.com/gradle/ 下载好了之后&…

三、安全工程—物理安全(CISSP)

目录 1.物理安全概述 2.物理安全计划 2.1 物理安全计划—考虑因素 2.2 物理安全—计划大纲

Spring 的 IOC 和 AOP

题目 Spring 的 IOC 和 AOP 推荐解析 IOC 是什么&#xff1f; IoC&#xff08;Inversion of Control&#xff09; 控制反转&#xff0c;是一种常见的设计思想&#xff0c;主要就是将手动创建对象的控制权&#xff0c;交给 Spring 框架来管理。 为什么需要存在一个容器&…

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别&#xff1f; 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1&#xff09;固定窗口计数器算法 2&#xff09;滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views&#xff08;Model-Based&#xff09; 项目视图(基于模型)4.1、 B…

12.for 条件循环语句 (3)

for 循环语句 允许脚本一次性读取多个信息&#xff0c;然后逐一对信息进行操作处理。当要处理的数据有范围时&#xff0c;使用for循环语句。 使用 for 循环语句从列表文件中读取多个用户名&#xff0c;然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.…

android studio从空白开始

对我来说&#xff0c;真正的第一步是清理电脑C盘。从剩余8G清理到25G&#xff0c;把原来看不顺眼又不敢删的文件夹和软件全删了&#xff0c;删爽了的后果就是&#xff0c;用两天的时间在把一些环境配置慢慢装回来&#xff0c;node.js&#xff0c;jdk&#xff0c;npm。努力把它们…

密码学中的承诺原语(Commitment Scheme)

1背景介绍 让我们考虑以下情况&#xff1a;Alice在佳士得&#xff08;Christies&#xff09;购买Banksy的最后一件杰作&#xff0c;在这之前&#xff0c;她会确保艺术品在售出后不会被销毁。 佳士得选择了维克里封闭竞标的拍卖方式&#xff0c;这是一种相当常见的做法&#x…

消息队列面试系列-01

1. 什么是消息队列&#xff1f; MQ全称为Message Queue 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#x…

Vue+Element(el-upload+el-form的使用)+springboot

目录 1、编写模板 2、发请求调接口 3、后端返回数据 1.编写实体类 2.Controller类 3、interface接口&#xff08;Service层接口&#xff09; 4.Service&#xff08;接口实现&#xff09; 5、interface接口&#xff08;Mapper层接口&#xff09; 6、xml 4、upload相关参…

前端 防止浏览器提示记住密码以及自动填充密码

当前端 <input /> 的 type’password‘ 时&#xff0c;浏览器为了优化用户体验&#xff0c;会在表单提交后提示用户记住密码 如果不想要这样的行为&#xff0c;最简单的当然是提示用户自己在浏览器设置中进行相关配置 如果希望在代码层面阻止浏览器提示是否记住密码或者…

.git 文件夹结构解析

.git 文件夹结构解析 在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的&#xff0c;以及在执行了相关的 Git 命令后这些文件会如何响应。 hooks&#xff08;钩&#xff09;&#xff1a;存放一些shell脚本info&#xff1a;存放仓库的一些信息logs&#xff…

【git】配置代理访问github

参考大神的方法 没有解决。GitHub访问加速 简直完美&#xff01; github经常Couldn’t connect to server zhangbinDESKTOP-1723CM1 MINGW64 /g/CDN/NET-EQ-DEV $ git clone https://github.com/TaoistKing/AudioPlc.git Cloning into AudioPlc... fatal: unable to access h…

ChromeDriver谷歌驱动最新版安装120/121/122

chromeDriver最新版本下载 最新驱动 https://googlechromelabs.github.io/chrome-for-testing/参考&#xff1a; https://blog.csdn.net/m0_57382185/article/details/134007615

ORM-02-Hibernate 对象关系映射(ORM)框架

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; Hibernate Hibernate ORM 允许开发者更轻松地编写那些数据在应用程序进程结束后仍然存在的应用程序。 作为一个对象关系映射&#xff08…

python闭包函数、装饰器、生成器

1. 闭包函数 什么是闭包函数 闭包函数就是在函数内部定义了一个函数&#xff08;内嵌函数&#xff09;&#xff0c;并将这个函数的引用作为返回值返回。 但是闭包函数可以调用外部函数的形参和变量&#xff0c;并且在外部调用闭包函数时&#xff0c;其外部函数的形参和变量仍…

基于蝗虫优化的KNN分类特征选择算法的matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 KNN分类器基本原理 4.2 特征选择的重要性 4.3 蝗虫优化算法&#xff08;GOA&#xff09; 5.完整程序 1.程序功能描述 基于蝗虫优化的KNN分类特征选择算法。使用蝗虫优化算法&#xff…

C++入门语法———命名空间,缺省参数,重载函数

文章目录 一.命名空间1.存在意义2.语法使用1.定义命名空间2.使用命名空间的三种方式 二.缺省参数1.全缺省参数2.半缺省参数 三.重载函数1.定义2.重载原理———名字修饰 一.命名空间 1.存在意义 C命名空间的主要意义是为了避免命名冲突&#xff0c;尤其是在大型项目中可能存在…

“高级SPA项目构建与路由实现“

目录 引言1. SPA项目构建1.1 安装vue-cli,webpack1.2 创建 Vue.js项目1.3 “一问一答”模式1.4 启动项目 2. SPA项目完成路由3. 基于SPA项目完成嵌套路由总结 引言 在现代Web开发中&#xff0c;单页应用&#xff08;SPA&#xff09;已经成为一种流行的开发模式。SPA通过在前端…