背景:算法小白,不完整刷过一遍代码随想录,记录一下训练营二刷的心得(语言:python)
二分查找
题目链接:704. Binary Search
二分法是很基础的算法思想,难点主要在对于边界的控制,也就是卡哥讲的两种思路中[left,right]与[left,right)之间的区别。第一遍自己写的时候也是忽略的这个问题,让right= len(nums)-1, 导致提交过程中发现 nums长度为1时会直接跳过搜索条件而报错。 最终修改后:
开区间写法
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
mid = left + (right - left)//2 #这里mid = (left + right)//2 也可以
if nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
闭区间写法
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while left <= right:
mid = left + (right - left)//2
if nums[mid] > target:
right = mid-1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
拓展题 34、35
题目链接:
34. Find First and Last Position of Element in Sorted Array
分别用二分法寻找左右边界
不同之处在于找不到目标值时返回的值
移除元素
题目链接:27. Remove Element
暴力解法
暴力解法两次遍历,一次找重复值一次删除值,需要注意的是删重复值时别忘记所有列表中的元素已经向前移一位,所以此时i的位置上是还没有查找过的数值,i -= 1来保证不会跳过该值。
def removeElement(self, nums: List[int], val: int) -> int:
l = k = len(nums)
i = 0
while i < l:
if nums[i] == val:
k-=1
for j in range(i,l-1):
nums[j] = nums[j+1]
i-=1
l-=1
i+=1
return k
双指针
def removeElement(self, nums: List[int], val: int) -> int:
slow = fast = 0
while fast < len(nums):
if nums[fast] == val:
fast += 1
else:
nums[slow] = nums[fast]
fast += 1
slow += 1
return slow