704.二分查找

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

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

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

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

27.移除元素

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

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

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