LeetCode 704 二分查找
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
mid = left + ((right - left) // 2)
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid
else:
return mid
return -1
想法:之前用左闭右闭的写法写过这道题,于是这次想用左闭右开的写法。因为right是不被考虑的,因此在更新mid时直接mid = right就行,不同于左闭右闭的right是被查找过的,所以mid = right + 1。
困难:TestcaseAC,提交时报错。在看了卡哥视频后发现是right边界定义的问题。由于是左闭右开的写法,right是没有被考虑进查找序列的,如果按照right = len(nums) -1,那么这个nums的最后一位将不会被查找到,因此需要改为right = len(nums)。
总结:边界定义很重要
LeetCode 27 移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fastIndex, slowIndex = 0,0
length = len(nums) - 1
while fastIndex <= length:
if nums[fastIndex] != val:
nums[slowIndex] = nums[fastIndex]
slowIndex += 1
fastIndex += 1
return slowIndex
想法:使用快慢指针。slowIndex作为更新后数组的下标,fastIndex作为更新数组的指针,如果nums[fastIndex] != val,那么更新数组nums[slowIndex] = nums[fastIndex]。
困难:反向的逻辑思考,刚开始写的时候考虑的是if nums[fastIndex] == val,虽然能写但是写得很别扭,按照卡哥视频中所讲的思路「如果不相等,更新覆盖数组」比较好。
总结:需要了解双指针解法,以及如何更新数组的逻辑