1. 二分法
● 题目链接1:704. 二分查找 - 力扣(LeetCode)
● 知识点:二分法:不断更新左右区间,取中间值与目标值对比。
● 困难和易错点:while left < right循环的时候,需要考虑left和right的区间,左闭右开:< or 左闭右闭: <=
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)
while left < right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle +1
elif nums[middle] > target:
right = middle
elif nums[middle] == target:
return middle
return -1
2. 双指针
● 题目链接2:27. 移除元素 - 力扣(LeetCode)
● 知识点:双指针:fast/slow指针,fast遍历原数组,寻找需要的元素;slow将需要的元素填入,更新数组。一个萝卜一个坑:fast找萝卜,slow填坑
● 困难和易错点:需要会暴力解法:2个for 循环。覆盖,不是删除
1. 暴力解法:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
ls = len(nums)
i = 0
while i < ls:
if nums[i] == val:
for j in range(i + 1, ls):
nums[j -1] = nums[j]
ls -= 1
i -= 1
i += 1
return ls
2. 双指针解法:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
index = 0
for i in range(len(nums)):
if nums[i] != val:
nums[index] = nums[i]
index += 1
return index
return nums[:index]