☆☆1011. 在 D 天内送达包裹的能力
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
二分法
思路
「在…限定条件内求取最小or最大值」是二分搜索题目常见的问法。
我们设定一个运载量x,以该运载量传送所有包裹需要y天,若出现如下情况。
y<=D,说明运载量x可能设置大了,保存该x,并把右边界设为x-1;y>D,说明运载量x设置小了,左边界设置为x+1
对于边界的设定。显然左边界lhs=max(weight),右边界rhs=sum(weight);
实现
class Solution {public:int shipWithinDays(vector<int>& weights, int D) {int l=1,r=0,ans=0;for(auto v:weights){r+=v;if(l<v) l=v;}while(l<=r){int mid=l+((r-l)>>1);if(istrue(weights,D,mid)){r=mid-1;ans=mid;}else{l=mid+1;}}return ans;}bool istrue(vector<int>& weights,int D,int carry){int cnt=1,curSum=0;for(auto v:weights){curSum+=v;if(curSum>carry){curSum=v;cnt++;}}return cnt<=D;}};
复杂度分析
- 时间复杂度:
- 空间复杂度:
☆☆875. 爱吃香蕉的珂珂
珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。
珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。
1 <= piles.length <= 10^4piles.length <= H <= 10^91 <= piles[i] <= 10^9
思路
「在…限定条件内求取最小or最大值」是二分搜索题目常见的问法。
我们设定一个速度x,以该速度吃香蕉需要cnt小时,若出现如下情况。
cnt<=H,吃的太快,说明x可能设置大了,保存该x,并把右边界设为x-1;cnt>H,吃的太慢,说明速度x设置小了,左边界设置为x+1
对于边界的设定。显然左边界lhs=1,右边界rhs=1e9;
算法
如何求得y?
对于piles[i],吃掉它需要的时间为t=piles[i]/x+(piles[i]%x!=0);故总时间为循环叠加!
实现
class Solution {public:int minEatingSpeed(vector<int>& piles, int H) {int l=1,r=1e9,ans=0;int n=piles.size();while(l<=r){long mid=l+((r-l)>>1);if(ifFinish(piles,H,mid)){ans=mid;r=mid-1;}else{l=mid+1;}}return ans;}bool ifFinish(vector<int>& piles, int H,long k){long cnt=0;for(auto val:piles){cnt+=val/k+(val%k!=0);}return cnt<=H;}
复杂度分析
- 时间复杂度:
- 空间复杂度:
题目标题难度划分
| 星级 | 题目难度 |
|---|---|
| ☆ | 简单 |
| ☆☆ | 中等 |
| ☆☆☆ | 困难 |
算法掌握难度程度划分
| 星级 | 掌握难度 |
|---|---|
| 无 | 普通 |
| ❤ | 经典,易掌握 |
| ❤❤ | 经典,略难掌握 |
| ❤❤❤ | 困难 |
