1. 二分查找
问题总结:
1.1 为了防止数值溢出,将r14改为mid = l + (r - l) // 2。注意python的整除是//。
1.2 开闭区间与循环不变量:一开始没有仔细思考开闭区间,直接将middle赋值给left或right,导致超时,通过添加r7~r12解决。
以左闭右开为例,修改后的代码:
2. 移除元素
空间复杂度O(n),时间复杂度O(n),事实上不符合题目“原地更改nums数组”的要求。用双指针解:
解法一,双向指针:l和r分别从左右两端逼近中间;解法二:快慢指针,快指针遍历数组,慢指针指向不等于val的数组的后一个元素。解法二更简洁清晰,解法一的条件判断容易出错。