因为本人自律性较差,非科班,打算重启一下CSDN写博客整理自己的想法的打算
闲话不多说
704 二分查找
这道题比较简单,但是在区间的判断上是比较有讲究的,可能一看就会,一做就错
class Solution:
def search(self, nums: List[int], target: int) -> int:
#二分查找法去不断的缩小范围,复杂度是logn
left = 0
right = len(nums)-1
while left <= right:
mid = left + (right-left)//2
if nums[mid] < target:
left = mid+1
elif nums[mid] > target:
right = mid-1
else:
return mid
return -1
while语句里面判断是否等于对我来说是深受其害,每次都忘了去写
注意要点是:在看了代码随想录后,发现二分查找可能会面对以下几个问题:寻找一个数、寻找左侧边界、寻找右侧边界,不等号是否应该带等号,mid 是否应该加一
27. 移除元素
这道题之前做过,如果是正向遍历的话,删除指定元素后,数组坐标的下标一定会发生改变,这样就会乱了套了。
方法1:倒序遍历
一个比较贱兮兮的做法是,既然正着遍历会改变数组的下标,下标是正着去数数的啊,我倒着去遍历,不就没有这回事了么。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
#倒序遍历删除
for i in range(len(nums)-1,-1,-1):
if nums[i] == val:
del nums[i]
return len(nums)
复杂度n,太巧了,可惜也太过于投机取巧了!!
方法2:快慢指针
又到了我怎么写怎么晕的过程
快慢指针的思路
定义一下快慢指针的运动规则,快指针一直在走,慢指针只有遇到快指针遇到非目标值才走,如果有非目标值,就不停的将非目标值搬运到slow的位置处
判断条件以快指针为主,相当于快指针是一个探索者,发现问题触发条件后让慢指针有下一步的动作
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = 0
slow = 0
while fast < len(nums):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow