代码随想录算法训练营二刷第一天| 704. 二分查找,27. 移除元素

代码随想录算法训练营二刷第一天| 704. 二分查找,27. 移除元素

文章目录

    • 代码随想录算法训练营二刷第一天| 704. 二分查找,27. 移除元素
      • 一、704. 二分查找
      • 二、35.搜索插入位置
      • 三、34. 在排序数组中查找元素的第一个和最后一个位置
      • 四、69.x 的平方根
      • 五、367. 有效的完全平方数
      • 六、27. 移除元素
      • 七、26. 删除有序数组中的重复项
      • 八、283. 移动零
      • 九、844. 比较含退格的字符串
      • 十、977.有序数组的平方

一、704. 二分查找

题目链接:
思路:维护好循环不变量。另外一个点注意别让加和超出int类型的限制,可以变为加差。
解法一:左闭右闭

public int search(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid - 1;}else {return mid;}}return -1;}

解法二:左闭右开

public int search(int[] nums, int target) {int left = 0, right = nums.length, mid = 0;while (left < right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid;}else {return mid;}}return -1;}

二、35.搜索插入位置

题目链接:
思路:经典二分查找。

public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid - 1;} else {return mid;}}return left;}

三、34. 在排序数组中查找元素的第一个和最后一个位置

题目链接
思路:分别用二分查找查左边界和右边界,查找区间的左边界,要在mid小于等于target时一直记录从左边逼近边界,而右边不做记录,同理求右边界也是如此。

class Solution {public int[] searchRange(int[] nums, int target) {if (nums.length == 0) {return new int[]{-1, -1};}int left = getLeftBorder(nums, target);int right = getRightBorder(nums, target);if (left == -2 || right == -2) {return new int[]{-1, -1};}if (right - left > 1) {return new int[]{left + 1, right - 1};}return new int[]{-1, -1};}int getLeftBorder(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0, leftBorder = -2;while (left <= right) {mid = left + ((right - left) >> 1);if (target <= nums[mid]) {right = mid - 1;leftBorder = right;}else {left = mid + 1;}}return leftBorder;}int getRightBorder(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0, rightBorder = -2;while (left <= right) {mid = left + ((right - left) >> 1);if (target >= nums[mid]) {left = mid + 1;rightBorder = left;}else {right = mid - 1;}}return rightBorder;}
}

四、69.x 的平方根

题目链接
思路:求平方根有小数的向下取整,这种情况下只要中值计算小于等于mid就一直搜集结果,和上面求边界的思路类似,当然注意防止溢出,要用long

class Solution {public int mySqrt(int x) {int left = 0, right = x, result = 0;while (left <= right) {int mid = left + ((right - left) >> 1);if ((long) mid * mid <= x) {result = mid;left = mid + 1;} else {right = mid - 1;}}return result;}
}

五、367. 有效的完全平方数

题目链接
思路:二分查找搜索即可,但是同样注意乘积使用long。

class Solution {public boolean isPerfectSquare(int num) {int left = 0, right = num, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);long temp = (long) mid * mid;if (temp == num) {return true;} else if (num < temp) {right = mid - 1;}else {left = mid + 1;}}return false;}
}

六、27. 移除元素

题目链接
思路:用一个变量k计数,记录相等元素的个数,不等则向前移动k个位置,最后返回数组长度减去k,因为k是要删除的元素。

class Solution {public int removeElement(int[] nums, int val) {int k = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] == val) {k++;}else {nums[i-k] = nums[i];}}return nums.length - k;}
}

双指针解法:一个快指针,一个慢指针,快指针向前遍历,快指针指向的元素不等于target,就将元素赋值给慢指针,慢指针再前进一步,这个思路和上面有一个变量记录要移动的距离类似,有异曲同工之妙。

class Solution {public int removeElement(int[] nums, int val) {int slow = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != val) {nums[slow++] = nums[i];}}return slow;}
}

双向指针法:一个关键点维护好循环不变量,然后从左寻找等于target的值(即要被覆盖的值),从右寻找不等于target的值(即要保留的值),找到之后即覆盖一次。

class Solution {public int removeElement(int[] nums, int val) {int left = 0, right = nums.length - 1;while (left <= right) {while (left <= right && nums[left] != val) {left++;}while (left <= right && nums[right] == val) {right--;}if (left <= right) {nums[left++] = nums[right--];}}return left;}
}

七、26. 删除有序数组中的重复项

题目链接
思路:因为数组是有序的,所以相同的元素都是紧挨着的,只需要比较相邻元素即可,只要当前元素与上一个元素相等就给元素k加1,当不相等时,就要往前移动k个位置,数组的长度即为删除掉K个元素之后的长度。

class Solution {public int removeDuplicates(int[] nums) {if (nums.length == 1) return 1;int k = 0;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i-1]) {k++;}else {nums[i-k] = nums[i];}}return nums.length - k;}
}

八、283. 移动零

题目链接
思路:这个移动零和前面删除元素类似,快慢指针然后交换元素即可。

class Solution {public void moveZeroes(int[] nums) {int slow = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {int temp = nums[slow];nums[slow++] = nums[i];nums[i] = temp;}}}
}

九、844. 比较含退格的字符串

题目链接
思路:从前往后要拼接字符串,从后往前就简单了,有#就记录,没有就跳过#数量,数量没了就比较是否相等,不等就返回false

class Solution {public boolean backspaceCompare(String s, String t) {int i = s.length() - 1, j = t.length() - 1;int skipS = 0, skipT = 0;while (i >= 0 || j >= 0) {while (i >= 0) {if (s.charAt(i) == '#') {skipS++;i--;} else if (skipS > 0) {skipS--;i--;}else {break;}}while (j >= 0) {if (t.charAt(j) == '#') {skipT++;j--;} else if (skipT > 0) {skipT--;j--;}else {break;}}if (i >= 0 && j >= 0) {if (s.charAt(i) != t.charAt(j)) {return false;}} else {if (i >= 0 || j >= 0) {return false;}}i--;j--;}return true;}
}

十、977.有序数组的平方

题目链接
思路:找到正数负数分界线,然后归并算法

class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;int negative = -1;for (int i = 0; i < n; ++i) {if (nums[i] < 0) {negative = i;} else {break;}}int[] ans = new int[n];int index = 0, i = negative, j = negative + 1;while (i >= 0 || j < n) {if (i < 0) {ans[index] = nums[j] * nums[j];++j;} else if (j == n) {ans[index] = nums[i] * nums[i];--i;} else if (nums[i] * nums[i] < nums[j] * nums[j]) {ans[index] = nums[i] * nums[i];--i;} else {ans[index] = nums[j] * nums[j];++j;}++index;}return ans;}}

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

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

相关文章

【回溯】总结

1、 组合和子集问题 组合问题需要满足一定要求才算作一个答案&#xff0c;比如数量要求&#xff08;k个数&#xff09;&#xff0c;累加和要求&#xff08;target&#xff09;。 子集问题是只要构成一个新的子集就算作一个答案。 进阶&#xff1a;去重逻辑。 一般都是要对同…

Linux 5种网络IO模型

Linux IO模型 网络IO的本质是socket的读取&#xff0c;socket在linux系统被抽象为流&#xff0c;IO可以理解为对流的操作。刚才说了&#xff0c;对于一次IO访问&#xff08;以read举例&#xff09;&#xff0c;数据会先被拷贝到操作系统内核的缓冲区中&#xff0c;然后才会从操…

LL库实现SPI MDA发送方式驱动WS2812

1&#xff0c;首先打卡STM32CubeMX&#xff0c;配置一下工程&#xff0c;这里使用的芯片是STM32F030F4P6。 时钟 SPI外设 SPI DMA 下载接口&#xff0c;这个不配置待会下程序后第二次就不好下载调试了。 工程配置&#xff0c;没啥说的 选择生成所有文件 将驱动都改为LL库 然后直…

OpenCV之特征点匹配

特征点选取 特征点探测方法有goodFeaturesToTrack(),cornerHarris()和SURF()。一般使用goodFeaturesToTrack()就能获得很好的特征点。goodFeaturesToTrack()定义&#xff1a; void goodFeaturesToTrack( InputArray image, OutputArray corners,int maxCorners, double qualit…

jmeter errstr :“unsupported field type for multipart.FileHeader“

在使用jmeter测试接口的时候&#xff0c;提示errstr :"unsupported field type for multipart.FileHeader"如图所示 这是因为我们 在HTTP信息头管理加content-type参数有问题 直接在HTTP请求中&#xff0c;勾选&#xff1a; use multipart/form-data for POST【中文…

22、touchGFX学习Model-View-Presenter设计模式

touchGFX采用MVP架构&#xff0c;如下所示&#xff1a; 本文界面如下所示&#xff1a; 本文将实现两个操作&#xff1a; 1、触摸屏点击开关按键实现打印开关显示信息&#xff0c;模拟开关灯效果 2、板载案按键控制触摸屏LED灯的显示和隐藏 一、触摸屏点击开关按键实现打印开…

Go语言之依赖管理

go module go module是Go1.11版本之后官方推出的版本管理工具&#xff0c;并且从Go1.13版本开始&#xff0c;go module将是Go语言默认的依赖管理工具。 GO111MODULE 要启用go module支持首先要设置环境变量GO111MODULE 通过它可以开启或关闭模块支持&#xff0c;它有三个可选…

docker搭建LNMP

docker安装 略 下载镜像 nginx:最新版php-fpm:根据自己需求而定mysql:根据自己需求定 以下是我搭建LNMP使用的镜像版本 rootVM-12-16-ubuntu:/docker/lnmp/php/etc# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0…

Linux的基本权限(文件,目录)

文章目录 前言一、Linux权限的概念二、Linux权限管理 1.文件访问者分类2.文件类型和访问类型3.文件访问权限的相关设置方法三、目录的权限四、权限的总结 前言 Linux下一切皆文件&#xff0c;指令的本质就是可执行文件&#xff0c;直接安装到了系统的某种路径下 一、Linux权限的…

embed mongodb 集成spring

在property文件下添加 de.flapdoodle.mongodb.embedded.version5.0.5 spring.mongodb.embedded.storage.oplog-size0不指定数据库&#xff0c;会使用test&#xff0c; port默认是0&#xff0c;随机端口号。 oplog-size mac默认是192mb, 其他系统会使用5%的磁盘可用空间&#x…

SpringCloud实用篇6——elasticsearch搜索功能

目录 1 DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.2.1 使用场景1.2.2 基本语法1.2.3 示例1.2.4 总结 1.3 精准查询1.3.1 term查询1.3.2 range查询1.3.3 总结 1.4.地理坐标查询1.4.1 矩形范围查询1.4.2 附近查询 1.5 复合查询1.5.1 相关性算分1.5.2 算分函数查询1&#xff0…

Python 字节码指令 LOAD_DEREF

LOAD_DEREF 是 Python 字节码指令&#xff0c;它与闭包和嵌套函数有关。要理解 LOAD_DEREF&#xff0c;我们首先需要了解 Python 中的几个概念&#xff1a;cell、free variable 和闭包。 Cell 和 Free Variables: 当一个嵌套函数引用了其上级作用域中的一个变量&#xff0c;但该…

【大数据Hive】hive 事务表使用详解

目录 一、前言 二、Hive事务背景知识 hive事务实现原理 hive事务原理之 —— delta文件夹命名格式 _orc_acid_version 说明 bucket_00000 合并器(Compactor) 二、Hive事务使用限制 参数设置 客户端参数设置 客户端参数设置 三、Hive事务使用操作演示 操作步骤 客…

(已解决)redis.get报错com.alibaba.fastjson.JSONException: autoType is not support

redis存取值问题&#xff0c;存自定义实体对象&#xff1b; 第一次取的时候报错&#xff1a;com.alibaba.fastjson.JSONException: autoType is not support。 GenericFastJsonRedisSerializer序列化和反序列化redis的value值&#xff0c;需要bean对象含有无参构造方法。 解决…

【C语言】回调函数,qsort排序函数的使用和自己实现,超详解

文章目录 前言一、回调函数是什么二、回调函数的使用1.使用标准库中的qsort函数2.利用qsort函数对结构体数组进行排序 三、实现qsort函数总结 先记录一下访问量突破2000啦&#xff0c;谢谢大家支持&#xff01;&#xff01;&#xff01; 这里是上期指针进阶链接&#xff0c;方便…

金融术语总结

洗钱 将犯罪或其他非法违法行为所获得的违法收入&#xff0c;通过各种手段掩饰、隐瞒、转化&#xff0c;使其在形式上合法化的行为。 存量客户 某个时间段里原先已有的客户,与新增客户相对应。 月活跃用户数量&#xff0c;MAU&#xff08;Monthly Active User&#xff0c;M…

【go语言基础】go中的方法

先思考一个问题&#xff0c;什么是方法&#xff0c;什么是函数&#xff1f; 方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型&#xff0c;这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则…

【100天精通python】Day37:GUI界面编程_PyQT从入门到实战(上)

目录 专栏导读 1 PyQt6 简介&#xff1a; 1.1 安装 PyQt6 和相关工具&#xff1a; 1.2 PyQt6 基础知识&#xff1a; 1.2.1 Qt 的基本概念和组件&#xff1a; 1.2.2 创建和使用 Qt 窗口、标签、按钮等基本组件 1.2.3 布局管理器&#xff1a;垂直布局、水平布局、网格布局…

typedef函数代码段解释以及部分Windows下的系统函数

文章目录 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress运行时获取一个动态链接库&#xff08;DLL&#xff09;中…

mysql与redis区别

mysql和redis的数据库类型 mysql是关系型数据库&#xff0c;主要用于存放持久化数据&#xff0c;将数据存储在硬盘中&#xff0c;读取速度较慢。 redis是NOSQL&#xff0c;即非关系型数据库&#xff0c;也是缓存数据库&#xff0c;即将数据存储在缓存中&#xff0c;缓存的读取速…