二分搜索-爱吃香蕉的珂珂
题目爱吃香蕉的珂珂解题思路要求返回在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数),转化一下等同于求右区间的左边界。
一般二分搜索都需要一个有序数列,此题没有有序数列,那怎么办呢?观察可知,如果有一个函数$f(k)$来表示当吃香蕉速度为$k$时,吃完所有香蕉所用的时间,那么$f(k)$是随着$k$单调递减的。只有知道了单调性,我们才能通过大小比较,来进行搜索区间的缩小。
代码实现1234567891011121314151617181920212223242526class Solution: def minEatingSpeed(self, piles: List[int], h: int) -> int: # 判断当前速度k,能否在h小时内吃完 def _can_finish(x): cnt = 0 for p in piles: cnt += p // x if p % x: ...
二分搜索-解题思路
二分搜索
在计算机科学中,二进制搜索,也被称为折半搜索算法,是一种搜索算法,每次搜索都能排除掉一半的不存在目标结果的集合,所以在最坏情况下,经过$log(n)$次搜索,得到最终结果。
解题实例如何将二分搜索以代码的形式,转化为解决某几类问题的利器呢?下面以两种类型的题目为例,总结出一种通用的解题思路。
1.搜索某个值搜索插入位置
12345678910111213141516171819class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while left <= right: # 搜索区间为[left, right] mid = left + (right - left) // 2 val = nums[mid] if val == target: # 找到目标值 ...