- 第一想法:
根据题目标题知道是用二分法。实现过程中出现的问题是弄错了mid的定义。
错误:m = int((r-l)/2)
正确:m = l+int((r-l)/2)
- 看完代码随想录的想法:
* 重点:
1. [left, right] -> while (left <= right) -> 两端的值都能取到,因为nums[m]不可能等于target,所以如果nums[m] > target的话,r = m - 1
2. [left, right) -> while (left < right) -> 右端的值不能取到,因为nums[m]可能等于target,所以如果nums[m] > target的话,r = m
- 困难:
在尝试左闭右开的时候,忘记了更新r的初始值。因为使用左闭右开,要保证右边一开始就是取不到的值,所以应该是r=len(nums)
# 27 移除元素
- 视频链接:
- 第一想法:
暴力解法:
# 暴力解法:
i = 0
count = 0 # number of elements in the list equal to val
for idx in range(len(nums)):
if val != nums[idx]:
nums[i] = nums[idx]
i += 1
else:
count += 1
for idx in range(len(nums)-count,len(nums)):
nums[idx] = 0
return len(nums)-count
题目提示:双指针法,但没有理解为什么要使用双指针,以及如何使用双指针
- 看完代码随想录的想法:
我的暴力写法貌似就是双指针法,但是我加了一些步骤,让nums后面部分等于0,让code冗长了一点。
- 困难:
没有太大困难
---------------------------------------------------------------------------------------------------------------------------------
# 35.搜索插入位置: 类704,主要改一下最后return的值
# 34.在排序数组中查找元素的第一个和最后一个位置:暴力解法很简单。使用两次二分法分别查找upperBound和lowerBound. lowerBound就是寻找左区间,所以将nums[m] >= target分在一起,return left;upperBound就是寻找右区间,所以将nums[m] <= target分在一起,return right。(还是有点迷糊)