☆☆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);

实现

  1. class Solution {
  2. public:
  3. int shipWithinDays(vector<int>& weights, int D) {
  4. int l=1,r=0,ans=0;
  5. for(auto v:weights){
  6. r+=v;
  7. if(l<v) l=v;
  8. }
  9. while(l<=r){
  10. int mid=l+((r-l)>>1);
  11. if(istrue(weights,D,mid)){
  12. r=mid-1;
  13. ans=mid;
  14. }
  15. else{
  16. l=mid+1;
  17. }
  18. }
  19. return ans;
  20. }
  21. bool istrue(vector<int>& weights,int D,int carry){
  22. int cnt=1,curSum=0;
  23. for(auto v:weights){
  24. curSum+=v;
  25. if(curSum>carry){
  26. curSum=v;
  27. cnt++;
  28. }
  29. }
  30. return cnt<=D;
  31. }
  32. };

复杂度分析

  • 时间复杂度:☆☆模板集群:二分法 - 图1
  • 空间复杂度:☆☆模板集群:二分法 - 图2

☆☆875. 爱吃香蕉的珂珂

珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

  • 1 <= piles.length <= 10^4
  • piles.length <= H <= 10^9
  • 1 <= 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);故总时间为循环叠加!

实现

  1. class Solution {
  2. public:
  3. int minEatingSpeed(vector<int>& piles, int H) {
  4. int l=1,r=1e9,ans=0;
  5. int n=piles.size();
  6. while(l<=r){
  7. long mid=l+((r-l)>>1);
  8. if(ifFinish(piles,H,mid)){
  9. ans=mid;
  10. r=mid-1;
  11. }
  12. else{
  13. l=mid+1;
  14. }
  15. }
  16. return ans;
  17. }
  18. bool ifFinish(vector<int>& piles, int H,long k){
  19. long cnt=0;
  20. for(auto val:piles){
  21. cnt+=val/k+(val%k!=0);
  22. }
  23. return cnt<=H;
  24. }

复杂度分析

  • 时间复杂度:☆☆模板集群:二分法 - 图3
  • 空间复杂度:☆☆模板集群:二分法 - 图4

题目标题难度划分

星级 题目难度
简单
☆☆ 中等
☆☆☆ 困难

算法掌握难度程度划分

星级 掌握难度
普通
经典,易掌握
❤❤ 经典,略难掌握
❤❤❤ 困难