【墨鳌】【一题双解】【二分答案 to 遍历+贪心】

题目链接
题解链接

基础: 二分

  • 先从最简单的思路开始
  • 首先,题目满足可二分性
  • 也就是说,当可以构造出 x"balloon"
  • 必然,可以构造出 x-1"balloon"
  • 于是,二分答案

复杂度

  • 时间复杂度: \(O(Nlog(N))\)
  • 空间复杂度: \(O(1)\)

代码

class Solution {
public:
    bool check(string&text,int x){
        int b=0,a=0,l=0,o=0,n=0;
        for(auto&c:text){
            b+=c=='b';
            a+=c=='a';
            l+=c=='l';
            o+=c=='o';
            n+=c=='n';
        }
        return b>=x && a>=x && l/2>=x && o/2>=x && n>=x;
    }

    int maxNumberOfBalloons(string text) {
        int l=0,r=text.size()/strlen("balloon");
        int ans=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(check(text,mid)){
                ans=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        return ans;
    }
};

进阶: 贪心

  • 借鉴二分思路的 check() 函数
  • 直接计数
  • 然后贪心

复杂度

  • 时间复杂度: \(O(N)\)
  • 空间复杂度: \(O(1)\)

代码

class Solution {
public:
    int maxNumberOfBalloons(string text) {
        int b=0,a=0,l=0,o=0,n=0;
        for(auto&c:text){
            b+=c=='b';
            a+=c=='a';
            l+=c=='l';
            o+=c=='o';
            n+=c=='n';
        }
        auto x=min(b,a);
        auto y=min(x,n);
        auto z=min(l,o)/2;
        return min(y,z);
    }
};
posted @ 2022-02-13 11:36  墨鳌  阅读(25)  评论(0编辑  收藏  举报