704. 二分查找
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
思路:这道题的核心思路就是利用二分查找求解,二分法前提需要将数组排序
左闭右闭:
def search(self, nums: List[int], target: int) -> int:
n = len(nums)
l, r = 0, n - 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
左闭右开:
因为右边边界是开着的,所以在区间中并没有nums[r]元素。 ,当nums[mid] > target时,范围区间变成了[l, mid),即[l, r)此时真实的取值范围是[l, r - 1],所以r的取值就会等于mid
def search(self, nums: List[int], target: int) -> int:
n = len(nums)
l, r = 0, n - 1
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
27. 移除元素
文章讲解:代码随想录
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
思路:同向双指针,一个指针一直向前,另一个指针只有交换位置的时候向前 + 1,当右指针指向列表最右边时循环结束。因为每找到一个不等于val值的元素后 l 都会 +1,即找到一个l == 1,两个l == 2 ……,所以只需要返回l就可以。
def removeElement(self, nums: List[int], val: int) -> int:
l, r = 0, 0
while r < len(nums):
if nums[r] != val:
nums[l] = nums[r]
l += 1
r += 1
return l
977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
思路:数组本身是有序的,只不过含有负数,此时最大值就在数组的两边,考虑使用双指针。
可以定义一个数组来存储平方后的元素,存放元素的顺序可以比较两个元素平方后的大小,也可以比较两数想加之后的大小。
比较平方
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
l, r, i = 0, n - 1, n - 1
ans = [0] * n
while l <= r:
if nums[l] ** 2 < nums[r] ** 2:
ans[i] = nums[r] ** 2
r -= 1
else:
ans[i] = nums[l] ** 2
l += 1
i -= 1
return ans
比较绝对值大小
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
l, r, i = 0, n - 1, n - 1
ans = [0] * n
while l <= r:
if nums[r] + nums[l] >= 0:
ans[i] = nums[r] ** 2
r -= 1
else:
ans[i] = nums[l] ** 2
l += 1
i -= 1
return ans
总结:双指针的前提是需要数组是有序的,其次双指针的位置可以是多样的,例如同向双指针和对向双指针。

284

被折叠的 条评论
为什么被折叠?



