1.了解到二分查找的两种写法。
2.将target所在范围区间定义成左闭右闭,当判定nums[mid]>target时,更新r=mid-1;因为nums[mid]不等于target,所以mid不是右边界点,所以要从mid-1开始再次判断。同理当nums[mid]<target时,更新l=mid+1;
3.将target所在范围区间定义成左闭右开,则nums[mid]>target时,更新r=mid;因为mid肯定不是右边界点。 而mid-1可能是target,但是因为右边界是开区间,所以不能取mid-1,因为mid-1还没判定是不是,而mid已经判定不是了,所以取成右边界没关系。
4.对于原地移除目标元素,且不使用额外空间。暴力算法是两层for循环,第一层遍历数组,如果有值和目标值相等,则进行第二层for循环,把之后的值都往前挪一位。注意,此时是在原数组上进行调整的,移位结束后i++,那么也就是说第一层循环的指针应该在数组前移之后-1,才能指向调整前实指向的值。
5.改进方法:双指针法,快慢指针法。时间复杂度从O(n^2)调整为O(n)。进行一层for循环,快指针正常向后进行,当遍历的值和目标值不相等时,用快指针指向的值覆盖在满指针指向的位置上。同时满指针再+1。
续续续:
1.刷题过程中意识到,不能在一开始就将所需要的变量全部定义出来,更不用说全定义成全局变量。eg:int n;in r=n; 我在全局定义这两个变量,但是n此时还没读入,所以r也是n.和你所想要的r值不同。 尽管你在后面读入了n值。
2.二分的时候,l与r值尽量设置成和题目相契合的值的范围,不要超过数组的长度。在某些情况下可能会有错误。