第 266 场力扣周赛前三题

Problem A - 统计字符串中的元音子字符串

题目描述:

子字符串 是字符串中的一个连续(非空)的字符序列。
元音子字符串 是 仅 由元音(‘a’、‘e’、‘i’、‘o’ 和 ‘u’)组成的一个子字符串,且必须包含 全部五种 元音。
给你一个字符串 word ,统计并返回 word 中 元音子字符串的数目 。

数据范围:

1 <= word.length <= 100
word 仅由小写英文字母组成

方法:
由于数据范围比较小,枚举起点和终点。
时间复杂度O( n 2 n^2 n2),空间复杂度O(1)。

class Solution {
public:
    int countVowelSubstrings(string word) {
        int ans=0;
        bool vis[26]={false};
        for(int i=0;i<word.size();i++){
            memset(vis,false,sizeof(vis));
            int count=0;
            for(int j=i;j<word.size();j++){
                if(word[j]=='a'||word[j]=='e'||word[j]=='i'||word[j]=='o'||word[j]=='u'){
                	//只对第一次出现的元音进行标记
                    if(!vis[word[j]-'a']){
                        vis[word[j]-'a']=true;
                        count++;
                    }
                }else{
                	//出现了辅音则直接结束循环
                	//从前往后枚举终点,中间出现了辅音,那么后面的终点就至少包括一个辅音
                    break;
                }
                //因为只对第一出现的元音进行计数,所以只有五个元音都出现了count才会等于5,并且某个元音出现多次也
                if(count==5)ans++;
            }
        }
        return ans;
    }
};

ProblemB-所有子字符串中的元音

题目描述:

给你一个字符串 word ,返回 word 的所有子字符串中 元音的总数 ,元音是指 ‘a’、‘e’、‘i’、‘o’ 和 ‘u’ 。
子字符串 是字符串中一个连续(非空)的字符序列。
注意:由于对 word 长度的限制比较宽松,答案可能超过有符号 32 位整数的范围。计算时需当心。

示例一:

输入:word = “aba”
输出:6
解释: 所有子字符串是:“a”、“ab”、“aba”、“b”、“ba” 和 “a” 。

  • “b” 中有 0 个元音
  • “a”、“ab”、“ba” 和 “a” 每个都有 1 个元音
  • “aba” 中有 2 个元音 因此,元音总数 = 0 + 1 + 1 + 1 + 1 + 2 = 6 。

数据范围:

1 <= word.length <= 1 0 5 10^5 105
word 由小写英文字母组成

方法:
对于每一个元音字符,它能产生 贡献的子字符串包括,以它为起点的子字符串,以它为终点的子字符串,以及它在中间的子字符串。
长度为len的字符串word,每个元音字符word[i]的贡献:

  • 1.以它为起点的子字符串的数量:len-i
  • 2.以它为终点的子字符串的数量:i+1
  • 3.它在中间的子字符串的数量:(len-i-1)×i(即左边每个位置和右边的每个位置组合)

由于以它为起点和终点的时候重复计算了只有它本身一个字符的子字符串,结果需要减一。
所以对于每个元音字符产生总的贡献:len-i+i+1-1+(len-i-1)×i=len+(len-i-1)×i
最终我们只要枚举每个字符,若是元音字符则计算贡献,时间复杂度O(n),空间复杂度O(1)。

class Solution {
public:
    long long countVowels(string word) {
        long long ans=0;
        for(int i=0;i<word.size();i++){
            if(word[i]=='a'||word[i]=='e'||word[i]=='i'||word[i]=='o'||word[i]=='u'){
                ans+=word.size();
                ans+=i*(word.size()-i-1);
            }
        }
        return ans;
    }
};

Problemc-分配给商店的最多商品的最小值

题目描述:

给你一个整数 n ,表示有 n 间零售商店。总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities表示,其中 quantities[i] 表示第 i 种商品的数目。
你需要将 所有商品 分配到零售商店,并遵守这些规则:

  1. 一间商店 至多 只能有 一种商品 ,但一间商店拥有的商品数目可以为 任意 件。

  2. 分配后,每间商店都会被分配一定数目的商品(可能为 0件)。用 x 表示所有商店中分配商品数目的最大值,你希望 x 越小越好。也就是说,你想 最小化 分配给任意商店商品数目的 最大值 。

请你返回最小的可能的 x 。

示例一:

输入:n = 6, quantities = [11,6]
输出:3
解释: 一种最优方案为:

  • 11 件种类为 0 的商品被分配到前 4 间商店,分配数目分别为:2,3,3,3 。
  • 6 件种类为 1 的商品被分配到另外 2 间商店,分配数目分别为:3,3 。
    分配给所有商店的最大商品数目为 max(2, 3, 3, 3, 3, 3) = 3 。

数据范围:

m == quantities.length
1 <= m <= n <= 1 0 5 10^5 105
1 <= quantities[i] <= 1 0 5 10^5 105

方法:
对于这种最小化最大值的题目一般考虑用二分来解决。
我们可以二分最大值,然后对于每种商品,按照最大值来分配给一个商店(最小化商店数),如果还剩下的一部分的话,则把剩下的分配给一个商店。如果最终分配的商店数量比n大,说明不能这样分配,需要提升最大值;如果最终分配的商店数量小于等于n的话,说明可以这样分配(由于商店可以分配0,所有小于n也可以),记录当前答案,然后降低最大值,再判断能不能分配(最小化)。
时间复杂度O(nlogn),空间复杂度O(1)。

class Solution {
public:
    int minimizedMaximum(int n, vector<int>& quantities) {
        int l=1,r=0x3f3f3f3f;
        int len=quantities.size();
        int ans=0;
        while(l<=r){
            int mid=(l+r)/2;
            int temp=0;
            for(int i=0;i<len;i++){
                temp+=quantities[i]/mid;
                if(quantities[i]%mid!=0)temp++;
            }
            if(temp>n){
                l=mid+1;
            }else{
                r=mid-1;
                ans=mid;
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值