数组理论基础:
programmercarl.com/%E6%95%B0%E…
704二分查找法
题目:
解析:
programmercarl.com/0704.%E4%BA…
自己的写法
思路:
这道题目的前提是数组为有序数组 同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。 对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
第一种是左闭右闭区间,就是left可以等于right
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
我的理解
是因为最终答案是左指针=右指针=middle一起指向的位置,当nums[middle] > target;代表middle现在这个位置就不是答案不可取,所以right要多减1;同理left要多加1
第二种target 是在一个在左闭右开的区间里,也就是[left, right)
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
我的理解
因为不能取右指针,当nums[middle] > target时,因为nums[middle]不能取,右指针也不能取,所以可以让 右指针=middle
27.移除元素
题目:
解析:
programmercarl.com/0027.%E7%A7…
我的写法
1.设置新数组
2.双指针
因为题目说元素顺序可以改变,所以如果和val相同就把末尾的调过来
关于left<right 不取=,是因为right=nums.length,没有减1,代表取的是左闭右开区间,所以要在下面都减1
总结
今天题目感觉不难,但是自己实现代码老是有一点瑕疵导致结果出不来,但是看完答案只是一些小点写错。总体来说不错,因为是二刷了,也收获了一些,比如l和r的区间问题