classSolution: defsearch(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while left <= right: middle = left + (right - left) // 2 if target < nums[middle]: right = middle -1 elif target > nums[middle]: left = middle + 1 else: return middle return -1
Leetcode35 搜索插入位置
看到有序数组就可以想到二分
与上题一样,考虑循环不变量,注意区间整体保持一致
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defsearchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) while left < right: middle = left + (right-left) // 2 if target < nums[middle]: right = middle if target > nums[middle]: left = middle + 1 if target == nums[middle]: return middle return right
classSolution: defsearchRange(self, nums: List[int], target: int) -> List[int]: left = 0 right = len(nums) middle = 0 while left < right: middle = left + (right-left) // 2 if target > nums[middle]: left = middle + 1 elif target < nums[middle]: right = middle else : break if left >= right: return [-1, -1] start = middle end = middle while start > 0and nums[start-1] == target: start -= 1 while end < len(nums)-1and nums[end+1] == target: end += 1 return [start, end]
Leetcode69 x的平方根
依然可以考虑二分查
要注意的是平方根开不尽的话要向下取整
给定的数的平方根一定在某两个整数之间
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: defmySqrt(self, x: int) -> int: left = 0 right = x ans = 0 while left <= right: middle = left + (right-left) // 2 if middle * middle <= x: ans = middle # 注意是更新left, 向后面去找 left = middle + 1 else: # 注意是更新right right = middle - 1 return ans
Leetcode367 有效的完全平方数
还是一样的二分查找
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defisPerfectSquare(self, num: int) -> bool: left = 0 right = num while left <= right: middle = left + (right-left) // 2 if middle * middle < num: left = middle + 1 elif middle * middle > num: right = middle - 1 else: returnTrue returnFalse
Leetcode26 删除有序数组中的重复项
数组是有序的,那么出现不同的元素一定是相邻的
定义两个快慢指针,slow=0、 fast=1
fast往后走,遇到与slow不相同的数值时,把值赋给slow+1,之后slow+1
重复此过程,直到fast走到底
Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defremoveDuplicates(self, nums: List[int]) -> int: ifnot nums: return0 slow = 0 fast = 1 while fast < len(nums): if nums[fast] == nums[slow]: fast += 1 else: nums[slow+1] = nums[fast] slow += 1 fast += 1 return slow+1
classSolution: defminSubArrayLen(self, target: int, nums: List[int]) -> int: sum = 0 start = 0 end = 0 length = len(nums) max_len = float('inf') for end inrange(length): sum = sum + nums[end] whilesum >= target: # 如果此时窗口内的和>=target,那么试着剔除窗口的第一个元素,看是否还成立 # 但操作前,需要先记录此时成立情况下的窗口长度 res = end - start + 1 if res < max_len: max_len = res sum = sum - nums[start] start += 1