LeetCode 周赛282

A 统计包含给定前缀的字符串

4min,合理

  • 贪心
class Solution {
public:
    bool isS(string a , string b){
        if(a.size() < b.size()) return false ;
        int cnt = 0 ;
        for(int i = 0 ; i < b.size() ; i ++){
            if(a[i] == b[i]) cnt ++ ;
        }
        if(cnt == b.size()) return true ;
        else return false ;
    }
    int prefixCount(vector<string>& words, string pref) {
        int ans = 0 ;
        for(int i = 0 ; i < words.size() ; i ++ ){
            if(isS(words[i] , pref)) ans ++ ;
        }
        return ans ;
    }
};

B 使两字符互为字母异位词的最少步骤

34min,离大谱。

  • 双指针,sort 后四种情况逐个判断
class Solution {
public:
    int minSteps(string s, string t) {
        int ans = 0 ;
        sort(s.begin() , s.end()) ;
        sort(t.begin() , t.end()) ;
        int i = 0 , j = 0 ;
        while(i < s.size() && j < t.size()){
            if(s[i] < t[j]){
                i ++ ;
                ans ++ ;
            }
            else if(s[i] > t[j]){
                j ++ ;
                ans ++ ;
            }
            else{
                if(i + 1 < s.size() && j + 1 < t.size() && s[i + 1] == t[j] && t[j + 1] == s[i]){
                    i ++ ; j ++ ;
                }
                else if(i + 1 < s.size() && s[i + 1] == t[j]){
                    ans ++ ; i ++ ;
                }
                else if (j + 1 < t.size() && t[j + 1] == s[i]){
                    j ++ ; ans ++ ;
                }
                else{
                    i ++ ; j ++ ;
                }
            }
        }
        if(i < s.size()) ans += s.size() - i ;
        if(j < t.size()) ans += t.size() - j ;
        return ans ;
    }
};
  • No.1 的 code
class Solution {
    int a[26];
public:
    int minSteps(string s, string t) {
        for(int i=0;i<s.size();i++) a[s[i]-'a']++;
        for(int i=0;i<t.size();i++) a[t[i]-'a']--;
        int ret=0;
        for(int i=0;i<=25;i++) ret+=abs(a[i]);
        return ret;
    }
};

abs 绝对值。对应字母计数算差值。

C 完成旅途最少的时间

迷茫

  • 超时
class Solution {
public:
    long long minimumTime(vector<int>& time, int totalTrips) {
        long long int ans = 0 ;
		sort(time.begin() , time.end()) ;
		while(totalTrips > 0){
			ans ++ ;
			for(int i = 0 ; i < time.size() ; i ++){
				if(ans % time[i] == 0) totalTrips -- ;
			}
		}
        
        return ans ;
    }
};
  • 二分

上一种方法考虑的是,每加一次时间长度,会多走几次 totaltrip。
而二分考虑的是,在可能的时间长度中(1,totaltrip*min(times)),用二分找唯一解。

class Solution {
public:
    bool check(long long int ans , vector<int>& time , int t){
        int cnt = 0 ;
        for(int i = 0 ; i < time.size() ; i ++){
            cnt += ans / time[i] ;
            if(cnt >= t) return true ;
        }
        return false ;
    }
    long long minimumTime(vector<int>& time, int t) {
        int MaxAns = *min_element(time.begin() , time.end()) ;
        long long int l = 1 , r = 1LL * MaxAns * t ;
        while(l < r){
            long long int mid = (l + r) >> 1 ;
            if(check(mid, time, t)) r = mid ;
            else l = mid + 1 ;
        }
        return l ;
    }
};

可能的时间长度最大值是,每一次都要走最小的值,而且要走 t 次。这个最大值在一些用例时可能会超出实际的最大值,但是作为抽象的最大值应是最大中的最大。
看到一些大佬的代码里最大值直接取了 1e14。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值