这算是第一次正式接触leetcode,从这里开始我开始正式刷题,并记录一些学习心得。
1.二分查找(leetcode题号704)
因为以前接触过二分查找,看到题目时便有了思路,他是一个升序数组,我们通过left=0,right=nums.size,middle=left+(right-left)(防止溢出),让left和right不断与middle毕竟来进行查找。
因为它是个升序数组,我们先与middle进行比较,若target大于middle,那target就在右边,我们再移动left到middle,再取middle=left+(right-left),若target小于middle那他就在左边,,我们再移动lright到middle,再取middle=left+(right-left),我们需要注意的是上述过程只是一个大概,而真正容易出现错的是有没有坚持同一个原则。例如我们在开始使用左闭右开原则时,我们的循环条件便是left<right
当我们移动right到middle时我们便不需要使得right=middle-1(target不等于middle),因为我们是右开,我们取不到right,而移动left时我们需要使得left=middle-1,我们是左闭,我们能取到left。
这就是这题的关键,也是我们最容易出错的地方。代码如下
2.移除元素(leetcode题号27)
方法一:暴力解法
第一层循环遍历数组找出val,第二层循环更新数组。需要注意的是,数组的删除操作并不是将这个元素完全删除,而是覆盖。
方法二:双指针法(重点)
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
fast与slow一同出发,再nums[fast]!=val时,不断地执行nums[slow]=nums[fast],当nums[fast]等于val,slow停下,直到nums[fast]!=val,这样继续将nums[fast]赋值给nums[slow],因为slow停在了需要删除的元素位置,通过赋值将他覆盖掉,来完成删除,代码如下:
注:为什么叫双指针,但这里没用到指针,因为数组里元素存放地址连续,可以用下表来表示。