数组理论基础,704. 二分查找,27. 移除元素
704:
因为最近刚刚开始刷代码随想录 正好就刚开始就碰到了算法训练营,所以对刚刷过的二分法印象还挺深刻的,挺快就复制粘贴般的写出来了,跟着大家写博客,也想加深一下自己对二分法的理解,就想在这个博客中写一下自己对二分的理解和对代码的记忆。
我习惯于用左闭右闭的的写法,因为在我自己用实际数据测试的时候,这种写法更有注意我理解,所以我就不多记忆左闭右开的写法了,避免默写代码的时候出错。那么对于二分法就剩下需要注意的细节就是在循环的终止条件和指针的左右移动了,在左闭右闭的情况下,可以允许左右指针重合,此时左指针右指针和中值都是同一个,可以进行和target的比较。且采用左闭右闭可以在移动指针时可以对左指针+1或右指针-1的操作,便于理解和记忆。
27:
卡哥的视频帮我理解了数组理论基础:数组是连续的,只能删除不能覆盖,移出元素后,每一个都要向前移动,数组的末尾放什么就不重要了,且数组的长度不变。物理空间的最火一个元素不做处理。
双指针法:define一个快指针一个慢指针,快指针是新数组所需要的值,慢指针是获取新数组中所要替换值的位置,快指针获取的值付给慢指针,慢指针的最后一个的下标就是新数组的长度。这里要大赞一下卡哥的视频讲解,视频讲解真的比文字更好理解,效果立竿见影,卡哥的讲解之后,真的就一下子get到了实现的逻辑。
看到官方解答还有一个双指针,卡哥给的是都是起始的双指针,看答案还有一个双指针是双向的,双向到两个指针交汇,但是实际上也并没有减少遍历值的个数,所以两种解决方法都是一样的。
sol1:
if nums is None or len(nums)==0:
return 0
slow, quick = 0, 0
while quick <= len(nums) - 1:
if nums[quick] != val:
nums[slow] = nums[quick]
slow += 1
quick += 1
return slow
sol2 :
if nums is None or len(nums)==0:
return 0
i,j = 0, len(nums)-1
while i < j:
if nums[i] == val:
nums[i], nums[j] = nums[j], nums[i]
j -= 1
if nums[i] != val:
i += 1
if nums[i] == val:
return i
else:
return i + 1
第一次写打卡博客,时间比较仓促,明天再来会更加有逻辑!!!
暑期实习offer plz!!!