力扣第 484 场周赛

https://leetcode.cn/contest/weekly-contest-484/

目录

总结

[Q1. 统计残差前缀](#Q1. 统计残差前缀)

[Q2. 中心子数组的数量](#Q2. 中心子数组的数量)

[Q3. 统计凯撒加密对数目](#Q3. 统计凯撒加密对数目)

[Q4. 增加操作后最大按位与的结果](#Q4. 增加操作后最大按位与的结果)


总结

理解能力有待提高

哈希表应用刷题

map和unordered_map区别

Q1. 统计残差前缀

不同字符数量==前缀长度%3

cpp 复制代码
class Solution {
public:
    int residuePrefixes(string s) {
        unordered_map<char,int> map;
        int ans=0;
        for(int i=0;i<s.size();i++){
            map[s[i]]++;
            if(map.size()==(i+1)%3)ans++;
        }
        return ans;
    }
};

Q2. 中心子数组的数量

cpp 复制代码
class Solution {
public:
    int centeredSubarrays(vector<int>& nums) {
        int ans=0;
        for(int left=0;left<nums.size();left++){
            unordered_map<int,int> map;
            int sum=0;
            for(int right=left;right<nums.size();right++){
                map[nums[right]]++;
                sum+=nums[right];
                if(map[sum])ans++;
            }
        }
        return ans;
    }
};

Q3. 统计凯撒加密对数目

思路正确但超时O(n²)

cpp 复制代码
class Solution {
public:
    long long countPairs(vector<string>& words) {
        vector<vector<int>> s(words.size());
        for(int i=0;i<words.size();i++){
            int len=words[i].size();
            s[i].resize(len);
            s[i][0]=0;//第0位统一为0
            for(int j=1;j<len;j++){
                s[i][j]=(words[i][j]-words[i][j-1]+26)%26;
            }
        }
        long long ans=0;
        for(int i=0;i<s.size();i++){
            for(int j=i+1;j<s.size();j++){
                if(s[i]==s[j])ans++;
            }
        }
        return ans;
    }
};

优化:改变存储方式

map优化

cpp 复制代码
class Solution {
public:
    long long countPairs(vector<string>& words) {
        map<vector<int>, long long> cnt;
        for (string& s: words) {
            int len=s.size();
            vector<int> key(len);
            key[0]=0;
            for(int i=1;i<len;i++){
                key[i]=(s[i]-s[i-1]+26)%26;
            }
            cnt[key]++;
        }
        long long ans=0;
        for(auto &[key,value]:cnt){
            ans+=value*(value-1)/2;
        }
        return ans;
    }
};

string优化

cpp 复制代码
class Solution {
public:
    long long countPairs(vector<string>& words) {
        unordered_map<string,long long>cnt;
        for (string& s: words) {
            int len=s.size();
            string key="";
            key+='0';
            for(int i=1;i<len;i++){
                int t=(s[i]-s[i-1]+26)%26;
                key+='#';
                key+=to_string(t);
            }
            cnt[key]++;
        }
        long long ans=0;
        for(auto &[key,value]:cnt){
            ans+=value*(value-1)/2;
        }
        return ans;
    }
};

Q4. 增加操作后最大按位与的结果

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法