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

704.二分查找

文档讲解: 代码随想录

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

  1. 第一想到的算法就是遍历数组判断是否等于要查找的元素,学习到一些编程技巧后知道用二分查找效率更高。

  2. 对区间的明确定义可以让逻辑更加清晰,闭区间就是可以取到的,开区间就是不能取到的,开区间不能取到所以用左闭右开时right要设置为nums.length,也就是要多一位,左闭右闭就不用多一位。同样的逻辑也可以用在计算完middle更新left或right那里, 用左闭右开时更新right时就不用减去1,因为取不到,用左闭右闭就需要减去1。

  3. 开区间不能取到所以用左闭右开时right要设置为nums.length,也就是要多一位。同样的逻辑也可以用在计算完middle更新left或right那里, 用左闭右开时更新right时就不用减去1,因为取不到。

4.明确了区间定义后实现起来就容易多了,降低了想的难度,学习了一个小时。

27.移除元素

文档讲解:代码随想录

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

  1. 第一想到的算法就是形象地想从数组中直接将这个元素清除,有点和打麻将拿出一张牌有点像,需要移动后面的元素。

  2. 首先是暴力解法,就是遍历到要删除的元素然后将后续的元素依次向前移动覆盖。然后是双指针解法,理解双指针在这个题中的定义非常重要,快指针是遍历旧数组的指针,慢指针是新数组的指针,只需要快指针循环一次,就可以完成暴力解法两层的循环,开始时快慢指针在同一个位置,如果fast指针所指元素是要删除的元素,fast指针继续移动,slow指针不懂,移动后如果fast指针所指元素不是要删除的元素,则对slow指针所指的位置赋值为fast指针所指的值,slow指针移动, fast指针继续移动,直到遍历到末尾结束,slow指针对应新数组长度。

  3. 暴力实现最开始用的是for循环,测试用例报错,原因在于用for循环遍历到要删除的位置,然后内层循环后续的元素向前依次移动,这个时候外层循环指向的位置可能仍然是需要删除的元素,但外层for循环已经去到了下一个位置,看了卡哥代码,是将外层循环的指针回退了一位,我用的while循环感觉逻辑更清晰。用双指针方法最开始没有理解双指针在这个题中的定义,导致写出了两层循环,代码反而更复杂,然后如果fast指针所指元素不是要删除的元素,则对slow指针所指的位置赋值为fast指针所指的值,slow指针移动, fast指针继续移动,这个逻辑也能处理nums数组第一个元素不是要删除元素的情况,虽然有点冗余计算,但代码逻辑比较简单。

相关推荐
dying_man14 分钟前
LeetCode--42.接雨水
算法·leetcode
vortex51 小时前
算法设计与分析 知识总结
算法
艾莉丝努力练剑1 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS05161 小时前
stack栈练习
c++·笔记·学习·算法·动态规划
hans汉斯2 小时前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
vortex53 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
前端拿破轮4 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
地平线开发者4 小时前
征程 6|工具链量化简介与代码实操
算法·自动驾驶
DoraBigHead4 小时前
🧠 小哆啦解题记——谁偷改了狗狗的台词?
算法
Kaltistss4 小时前
240.搜索二维矩阵Ⅱ
线性代数·算法·矩阵