-
今日学习的文章链接:
-
704. 二分查找
-
看到题目的第一想法:
-
之前了解过二分法,只记得left,right左右指针了,完全忘记了还有middle指针,分区间和边界处理问题。二分法果然是:一看就会,一写就废,还是要把区间边界弄清楚,才能领会这道题的思想精髓。
-
看完代码随想录之后的想法
-
看了答案之后感觉这题很简单,so easy!
-
如果是左闭右闭区间 [left,right],举个例子判断一下:[1,1]合理,那么left可以等于right。那么while(left <= right),在nums[middle] > target 时,right = middle - 1,在nums[middle] < target 时,left = middle + 1。
-
如果是左闭右开区间 [left,right),举个例子判断一下:[1,1)不合理,那么left不可以等于right。那么while(left < right),在nums[middle] > target 时,right = middle ,在nums[middle] < target 时,left = middle + 1。
-
实现过程中遇到哪些困难:
-
主要就是区间边界问题容易乱。
-
Python3代码如下:
-
(版本一)左闭右闭区间 [left,right]:
-
class Solution: def search(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 while left <= right: middle = (left + right) // 2 if nums[middle] < target: left = middle + 1 elif nums[middle] > target: right = middle - 1 else: return middle return -1
(版本二)左闭右开区间 [left,right):
class Solution: def search(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) while left < right: middle = (left + right) // 2 if nums[middle] < target: left = middle + 1 elif nums[middle] > target: right = middle else: return middle return -1
27. 移除元素
- 看到题目的第一想法:
- 使用快慢指针,以前看见过,但却写不出来。。。
- 看完代码随想录之后的想法:
- 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 代码很简洁,思路也很清楚,fast快指针记录新数组中的元素,慢指针记录新数组中的位置,数组长度是返回慢指针
- 但是暴力解法总是写不对!不知道错在哪?后来我发现是因为Python中的for循环的i是不能后退的,所以后来采用从后往前遍历,把这个问题解决了!
- 暴力解法:空间复杂度O(n^2),时间复杂度O(1)
class Solution: def removeElement(self, nums: List[int], val: int) -> int: size = len(nums) for i in range(size-1,-1,-1): if nums[i] == val: for j in range(i+1, size): nums[j-1] = nums[j] size -=1 return size
-
双指针法:空间复杂度O(n),时间复杂度O(1)
-
class Solution: def removeElement(self, nums: List[int], val: int) -> int: fast = slow = 0 while fast < len(nums): if nums[fast] != val: nums[slow] = nums[fast] slow += 1 fast += 1 return slow
-
今日收获:双指针法yyds
-
记录一下自己的学习时长:3小时