题目链接:
leetcode 704: 二分法查找
https://leetcode.com/problems/binary-search/
讲解链接:
看到题目的第一思路:
题目不难 但是没有很直接快速的思路
代码随想录之后的想法和总结:
加深了对二分法的理解 以及两种区间写法的运用 以后可以更加熟练的使用
遇到的困难:
无 自己手动梳理了一遍循环的过程
可以记录备用的固定代码方法模版:
二分法(左闭右闭区间):
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义target在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target在左区间,所以[left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target在右区间,所以[middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
V
题目链接:
leetoce 27: 原地移除元素,并返回移除后数组的新长度
https://leetcode.com/problems/remove-element/
讲解链接:
看到题目的第一思路:
思路偏向于删除而不是覆盖 对数组的基础理论知识不够完善
代码随想录之后的想法和总结:
加深对于双指针算法的理解:
这题解法的核心就是遍历数据过程中遇到等于目标值就直接跳过,不等于目标值就赋值,这样就能 过滤掉(也就是删除掉)目标值
快指针用来寻找,慢指针用来存储
一些在评论区看到的好的问题与回答:
问:为啥没有删除元素,只是覆盖?
答:因为数组定义,数组是一个连续空间,如果删除元素,就会缺了一个空间,所以在数组中进行删除操作其实是进行覆盖操作。
问:在return 数组的时候不是把所有元素都return回来,而是只留下了保留的元素?
答:视频中进行删除操作也就是覆盖操作的之后,返回的是slow指针,那么力扣上会把这个slow指针当作数组的长度,所以返回出来的就是进行删除操作或者说覆盖操作之后的数组。
问:为啥要return slow 不是slow➕1 删除后长度不是6吗
答:因为每次更新完nums【slow】之后,slow都会加1,指向下一个位置,所以结束的时候slow的值已经就是新数组的长度了,nums中0到 slow-1 的位置才是移除过val的新数组。
遇到的困难:
暂无
可以记录备用的固定代码方法模版:
暂无
今日收获,学习时长:
第一天学习进度稍慢 有其他事情打断 之后更加勤劳赶进度
学习时长大概3h之内(有不够专心和集中的时刻 希望之后加强效率 缩短时间 养成习惯)