(1)第一部分是二分法,主要是middle 的计算与边界处理,其他略
上面的比较类似,就是二分法的简单应用,不再赘述
(2)下面这个和滑动窗口联系起来了,主要是确定范围这一步,就是找到一个相等的数的位置,然后向左向右扩展直到不等,返回范围
(3)也是普通的二分法,就是边界注意一下就行
(5)第二部分 是双指针,这种题的一般思路就是1)两个指针2)快的遍历一遍数组,慢的指向不等于val的下标,如果遇到的话就用fast找到的不等于val的后面的数进行覆盖3)需要格外注意一下的话就是什么时候赋值,基本上都是不等于的时候赋值(或许加个判断可以减少部分赋值的情况),等于的时候fast或者是slow向前或向后调整
当然,不用双指针,就是遍历,暴力破解也是可以的
27 解析 暴力法不做解释
快慢指针 快指针遍历数组,在这个过程中当其值不等于val时,将该值赋值给慢指针指向的数据,慢指针更新,返回慢指针的下标(也就是慢指针指向的总是不等于val的值,当遇到等于val的值时,慢指针不动,fast一直遍历直到找到不等于val的值的下标,再赋值给那个等于val的slow的数据,slow更新,即使后面没有也没事,要求返回的是新数组的长度,可以保证slow前面的数据都是不等于val的,然后如果slow走到了最后也不会越界,因为每次更新的时候slow都+1,也就是比此时的fast大1)但是不是直接按照()里的思路来写
这道题的话因为是找重复项,所以1)fast从1开始,比较fast与slow指向的数据是否相等 2)不等就slow+1,fast赋值给slow(如果指向同一位,就相当于什么也不干),继续向后,相等的话什么也不干,fast向前,直到找到不同的数,然后slow+1,赋值,就把slow后面的相等的数给用不同的数覆盖了,最后fast遍历完了,slow指向的就是当前所有不重复的数的下标,根据题意返回就可
26 解析
因为是只出现一次,所以要各元素之间比较,fast从1开始,不等的话slow+1,然后赋值fast给slow,指向一个元素的话就不会影响,否则的话slow更新为下一个不相等的
(6)下面是扩展题,283就和27一样,只是val=0,题目要求0移到末尾,就是把其他非零元素移到前面,slow后面的置零
844与前面不同的是需要退格,大体思路还是1)相等赋值,不等操作2)这里操作就是slow后退,后退多少再分析3)注意为空的时候就不能后退了