704. 二分查找
搜索问题明确:
1)定义区间:左闭右开,左闭右闭
2)while 循环是否包含left==right的情况:
- 左闭右开条件下,left闭区间,right开区间,left==right,无效;
- 左闭右闭条件下,left和right都是闭区间,left==right,存在
3)左闭右开的条件下,不用在while循环外单独考虑left==right的情况
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右开区间
left,right = 0, len(nums)
while left<right:
mid = (left+right)//2
if nums[mid]>target:
right = mid
elif nums[mid]<target:
left = mid+1
else:
return mid
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
# 左闭右闭区间
while left<=right:
mid = (left+right)//2
if nums[mid]>target:
right = mid-1
elif nums[mid]<target:
left = mid+1
else:
return mid
return -1
27. 移除元素
1)分解问题:原数组修改,同时找到需要剔除的元素位置,并且和遍历的非val元素替换
2)采用快慢指针求解,fast指针遍历nums数组元素,slow指针记录需要替换的元素位置
3)只在遍历元素!=val时,交换快慢指针元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast, slow = 0, 0
for fast in range (len(nums)):
if nums[fast]!=val:
nums[slow]=nums[fast]
slow +=1
return slow
27. 移除元素-暴力解
暂略,待补充
977.有序数组的平方
1)分解问题:非递减数组,平方排序。说明左右两端存在平方后的最大值。数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
2)双指针定义:左右两端比较平方最大值,逐渐向中间移动。
3)while循环要取==
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
min = 0
max = len(nums)-1
results = []
while min<=max:
if nums[max]**2>nums[min]**2:
results.append(nums[max]**2)
max -=1
else:
results.append(nums[min]**2)
min +=1
return results[::-1]
796

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



