Day 1 | 704. 二分查找、27. 移除元素
704. 二分查找
题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.二分查找.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
思考
二分搜索一看就会,一写就废,while的判断条件和左边界、右边界怎么更新经常容易写错。
需要明确二分查找的区间定义,推荐左闭右闭的写法,即要查找的target在[left,right]区间内。
这样很容易明白跳出条件 while(left<=right) ,因为当left==right时,[left,right]还是有意义的区间。
mid不等于target时,left、right如何更新?
left 更新为 mid + 1
right 更新 mid - 1
因为,mid不等于target,区间定义又是左闭右闭的,边界需要跳过mid,到下一个。
class Solution:
def search(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums)-1
while l <= r:
mid = int((l+r)/2)
if nums[mid] > target:
r = mid - 1
elif nums[mid] < target:
l = mid + 1
else:
return mid
return -1
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.移除元素.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
思考
这道题目是经典的双指针题目,需要原地进行操作,节省空间。
在工作中也会经常遇到类似的场景,比如c语言需要提前申请空间,且大小不变,原地进行元素的移除。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 快指针i遍历原数组
# 慢指针j原地更新 新数组
j = 0
for i in range(len(nums)):
if nums[i]!=val:
nums[j] = nums[i]
j+=1
return j
浙公网安备 33010602011771号