Leetcode704.二分查找
题目链接:力扣
因为之前看过卡哥对这题的讲解视频,所以再次看到这题时脑袋里第一反应就是循环不变量。
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右开式
# l = 0
# r = len(nums)
# while l < r:
# mid = (l + r)//2 #注意整除是//
# if nums[mid] == target:
# return mid
# elif nums[mid] > target:
# r = mid
# else:
# l = mid + 1
# return -1
# 左闭右闭式
l = 0
r = len(nums) - 1
while l <= r:
mid = (l + r)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
r = mid - 1
else:
l = mid + 1
return -1
Leetcode27.移除元素
题目链接:力扣
看到官方给的示例2,第一反应就是相向双指针,解法相向双指针1里巧妙地规避了再用循环,但是可能也造成了一些无效的赋值操作,相向双指针2逻辑更好理解一些,但是要注意一些边界条件,快慢指针较为简单。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 相向双指针1
# l = 0
# r = len(nums) - 1
# while l <= r:
# if nums[l] == val:
# nums[l] = nums[r]
# r -= 1
# else:
# l += 1
# return l
# 相向双指针2
# l = 0
# r = len(nums) - 1
# while l <= r:
# while l<=r and nums[l] != val:
# l += 1
# while l<=r and nums[r] == val:
# r -= 1
# if l < r:
# nums[l] = nums[r]
# l+=1;r-=1
# return l
# 快慢指针
slow = 0
for fast in range(0, len(nums)):
if nums[fast]!= val:
nums[slow] = nums[fast]
slow +=1
return slow