LeetCode 704 二分查找(binary search)
考点: 对corner case 的考察
这是二刷二分了,决定用倒叙的方法来想如何决定左右开闭区间:
首先不出意外,大家第一个会停顿的地方就是在while循环截止处,到底在等于的时候需不需要考虑进循环?这样就分为了两个情况进 OR 不进:
- 第一个也是我自己比较习惯的就是进!这种情况侧面说明了我采用了左右都是闭区间的想法(closed interval),即数字皆有意义。那么这就意味着在最后一个情况下,也就是left == right 时,依然需要比较(假设[5,5] 说明最后这个5 也是有意义并且也是需要考虑的)。
接下来,进入循环后,我们就要根据结果移动指针,这时候就迎来了第二个困惑,left = mid + 1 OR left = mid。 而我们又要想起那句话 数字皆有意义!!! 也就是说,既然上一次循环已经把该数字进行比较了,那下一个直接跳到他下一个不就好了吗!所以在这样的情况下 left = mid + 1 才是心之所向,因为Mid 已经在当前循环下比较过了,再比较也没有意义了。 - 那么现在我们考虑另一种情况:坚决不进!那也就是左闭右开的情况,循环的截止就变成了left < right, 举个例子来说,一个集合是 [5,5) 显然是不现实的。而进循环后: 如何跳动指针呢?复用上面一句话,比过的数字就不比了,这样在左闭区间 ,有意义的数值说明已经比较过了, 那么直接考虑 left = mid +1 即可,相反,右边是开区间,说明那个值在当前情况下是没有比较到的,这样就需要 right = mid 以便可以遍历到数组中所有的值 。
总结来说, 写这道题的时候,我会一直反问自己: 当前比较的数字到底是不是有意义的?有意义就比较好了跳过,没有意义就要让她一直“没有意义”下去。
LeetCode 27: RemoveElement
难点: 在碰到相同元素的时候,我的错误思维是开启另一个指针往后寻找,找到不一样的元素就可以直接拿过来。然后以此类推。 后来发现,这样当第二个指针启动的时候,会再一次遍历到从刚刚后面拿过来的数据。 所以逻辑上是有漏洞的,总结来说,自己不熟练的是如何把下一个符合条件的数字拿过来并且因为该数字还存在于数组,如何避免又把该数字拿过来重新代入计算。
快慢指针的解法很直白,但是没想到 如何运用她们。
这周应该会再刷一遍,再加上扩展题目(希望自己挖的坑可以在这周末填上,哈哈)
重度拖延的我在27号又刷了一次:
看了自己的错误题解,了解到其实解题的大概思路是对的。
开启2个指针往后遍历,遇到=value的slow 就不走了 fast去寻找下一个符合条件的数值(!= val),找到之后拿过来替换掉slow里的数值. 之后slow就向下走一步(因为他的意义就是要被替换的元素,既然替换完就可以继续向下走了)
自己是把双指针的思路安到了暴力枚举上,结果就摸不清楚下一个循环在干嘛,到底要走多少次
扩展:
26 删除排序数组中的重复项
和上面一道题的思路非常的像
283.移动零
同理,遇到0就swap.