leetcode 第 248 场算法比赛

作者: | 更新日期:

后缀数组我还不会,有必要学习一下了。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛前三题非常简单,第四题是后缀数组模板题,,可是我还不会后缀数组,所以就没做出来了。

一、基于排列构建数组

题意:给一个排列num,求每个位置置换为nums[nums[i]]后的排列。

思路:循环模拟即可。

vector<int> buildArray(vector<int>& nums) {
    vector<int> ans(nums.size());
    for(int i=0;i<nums.size();i++){
        ans[i] = nums[nums[i]];
    }
    return ans;
}

二、消灭怪物的最大数量

题意:给若干怪物的位置与速度,每一分钟开始那一刻可以杀死任意一个怪物,问在怪物到达城市之前,最多可以杀死多少个怪物?

边界:如果整点怪物到达,必须在整点之前的那一分钟杀死怪物。

思路:预处理出所有怪物应该在哪一分钟杀死,然后扫描每一分钟并杀死一个可以杀死的怪物,然后判断是否有剩余,有了则代表怪物到达城市,游戏结束。

int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
    int n = dist.size();
    vector<int> times(n);
    for(int i=0;i<dist.size();i++){
        times[i] = dist[i] / speed[i] - (dist[i] % speed[i] == 0 ? 1 : 0);
    }
    sort(times.begin(), times.end());

    int ans = 0;
    for(int i=0;i<n;i++){
        if(i > times[i]){
            break;
        }
        ans++;
    }
    return ans;
}

三、统计好数字的数目

题目:如果一个数字字符串的偶数位都是偶数,奇数位都是素数,则称为好数字。
现在求所有 n 位数字字符串中,好数字的个数。

边界:允许有前缀 0.

思路:既然允许有前缀 0,每一位互相独立,偶数有 5 中选择,奇数有 4 中选择,全部相乘即可。

class Solution {
    ll powMod(ll a, ll b, ll c){
        ll res = 1LL;
        while (b) {
            if(b & 1) res = res * a % c;
            a = a * a % c;
            b >>= 1;
        }
        return res;
    }
public:
    int countGoodNumbers(long long n) {
        ll odd = n/2;
        ll even = n - odd;
        return (powMod(5, even, mod) * powMod(4, odd, mod)) % mod;
    }
};

四、最长公共子路径

题意:给 n 个整数数组,求最长公共子数组的长度。

思路:显然是后缀数组模板题,可是我不会后缀数组,网上又没搜到现场的多字符串最长公共子数组模板,所以最后也没做出来。

其实我之前自己也使用非后缀数组做过这类题。

不过现在我一看题型就想到后缀数组。
思维形成定式,再去想其他方法,就总是被后缀数组思想干扰了。

后面还是要学习下后缀数组才行,不然比赛就有点吃亏了。

五、最后

这次比赛最后一题你是怎么做的呢?

加油,算法人。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越