Leetcode刷题第三天-二分查找
没二分,数组头尾分别插入最小值和最大值,比较num[i-1]<num[i]>num[i+1]
class Solution: def findPeakElement(self, nums: List[int]) -> int: if not nums: return None max_num,min_num=min(nums)-1,min(nums)-1 new_nums=[min_num]+nums+[max_num] left,right=1,len(nums) for i in range(left,right+1): if new_nums[i-1]<new_nums[i] and new_nums[i]>new_nums[i+1]: return i-1
167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)
头+尾大于目标尾减,小于目标头加
class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: if not numbers: return None left,right=0,len(numbers)-1 while left<right: if numbers[left]+numbers[right]>target: right-=1 elif numbers[left]+numbers[right]<target: left+=1 else: return [left+1,right+1]
快慢指针
慢指针指向窗口头,快指针向前走,计算快慢指针之间数据和
- 和小于目标值,快指针向前走
- 和大于等于目标值,快指针不动,记录窗口长度,和减去当前慢指针数据,慢向前走
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: if not nums: return 0 slow,fast,sums=0,0,0 re=len(nums)+1 while slow<=fast: if sums<target: if fast<len(nums): sums+=nums[fast] fast+=1 else: break else: re=min(re,fast-slow) sums-=nums[slow] slow+=1 if re==len(nums)+1: return 0 return re
按行进行二分,应该还有简单的方法,容我思考思考
class Solution: def help(self,nums,target): if not nums: return False left,right=0,len(nums) while left<right: middle=int((left+right)/2) if nums[middle]==target: return True elif nums[middle]>target: right=middle else: left=middle+1 return False def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: if not matrix: return False left,right=0,len(matrix) for i in range(right): if self.help(matrix[i],target): return True return False

浙公网安备 33010602011771号