力扣373周赛

力扣第373场周赛

文章目录

  • 力扣第373场周赛
    • 循环移位后的矩阵相似检查
    • 统计美丽子字符串 I
    • 交换得到字典序最小的数组
    • 统计美丽子字符串 II

循环移位后的矩阵相似检查

模拟,(j+k)%m计算右移,(j-k+m)%m计算左移

class Solution {
public:
    bool areSimilar(vector<vector<int>>& mat, int k) {
        int n = mat.size() , m = mat[0].size();
        k %= m;
        int ans[n][m];
        for(int i = 0 ; i < n ; i ++){
            for(int j = 0 ; j < m ; j ++){
                if(i & 1)ans[i][(j+k)%m] = mat[i][j];
                else ans[i][(j-k+m)%m]=mat[i][j]; 
            }
        }
        for(int i = 0 ; i < n ; i ++){
            for(int j = 0 ; j < m ; j ++){
                if(ans[i][j] != mat[i][j])return false;
            }
        }
        return true;
    }
};

统计美丽子字符串 I

前缀和暴力

class Solution {
public:

    int beautifulSubstrings(string s, int k) {
        int n = s.size();
        int v[n+5] , c[n+5];
        v[0] = c[0] = 0;
        for(int i = 0 ; i < n ; i ++){
            v[i+1]=v[i];
            c[i+1]=c[i];
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'){
                v[i+1]++;
            }else{
                c[i+1]++;
            }
        }
        int ans = 0;
        for(int i = 0 ; i < n ; i ++){
            for(int j = 0 ; j <= i ; j ++){
                int x = v[i+1]-v[j] , y = c[i+1]-c[j];
                if(x == y && ((x * y) % k == 0))ans ++;
            }
        }
        return ans;
    }
};

交换得到字典序最小的数组

分段排序后排序,难在模拟

class Solution {
public:
    vector<int> lexicographicallySmallestArray(vector<int>& nums, int limit) {
        //第一部分排序
        int n = nums.size();
        vector<pair<int,int>>v;//每个点值,下标
        for(int i = 0 ; i < n ; i ++)v.emplace_back(nums[i] , i);
        sort(v.begin(),v.end());

        //第二部分分段
        vector<vector<pair<int,int>>>segs;//段
        int last = -limit;
        for(int i = 0 ; i < n ; i ++){ //v
            if(v[i].first - last > limit)segs.push_back({});//新段
            segs.back().push_back(v[i]);
            last = v[i].first;
        }

        //第三部分回填
        vector<int>ans(n);
        for(auto &seg : segs){
           vector<int> pos;
            for (auto &p : seg) pos.push_back(p.second);//取所有下标排序
            sort(pos.begin(), pos.end());
            for (int i = 0; i < seg.size(); i++) ans[pos[i]] = seg[i].first;
        }
        return ans;
    }
};

统计美丽子字符串 II

补题…


你可能感兴趣的:(力扣,leetcode,算法,c++)