谨以此系列记录刷题思路
Leetcode 704 二分查找
在写二分查找时,主要的问题出在 for
循环的结束条件和 left
、right
的更新上,即为边界条件的判断。
总结一下边界问题:
左毕右毕区间:while left <= right、left = middle + 1、right = middle - 1
其中right初始化为len(nums)-1
左开右毕区间:while left < right、left = middle + 1、right = middle其中right初始化为len(nums)
同时应该在题目中有有序数组时想到使用二分查找或者其变体
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
#左毕右毕区间
#for i in range(right): 错误1:在这里用到for循环
while left <= right:
middle = (left + right)//2
if target > nums[middle]:
#left = middle 错误2:在left、right的更新上
left = middle + 1
elif target == nums[middle]:
return middle
else:
#right = middle
right = middle - 1
return -1
Leetcode 27 移除元素
在移除元素时需要没有仔细审题,k的值应为与val不同的元素的数量。另外应该先对索引更新然后再更新k值
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
k = 0
for i in range(len(nums)):
if nums[i] != val:
nums[k] = nums[i]
k += 1
return k
Leetcode 977 有序数组的平方
在此题中先用暴力解法进行尝试,在卡哥那学到了双指针法的解题思路。为了方便记忆,在此处先进行口头回顾:由于nums是非递减数组,所以最大值应该在平方后数组的两端,这是前提很重要,然后将双指针分别指向nums的头和尾,比较大小,取较大值更新至ans的末尾,然后更新i、j(两个指针)。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
i, j = 0, n - 1
ans = [0] * len(nums)
for p in range(n - 1, -1,-1):
if nums[i] ** 2 > nums[j] ** 2:
ans[p] = nums[i] ** 2
i += 1
else:
ans[p] = nums[j] ** 2
j -= 1
return ans