Leetcode第 291 场周赛

Leetcode第 291 场周赛

2259. 移除指定数字得到的最大结果

原题链接

算法标签 排序 模拟

代码

class Solution {
public:
    string removeDigit(string num, char digit) {
        int cnt=0;
        for(int i=0;i vs;
        for(int i=0;i());
        return vs[0];
    }
};

2260. 必须拿起的最小连续卡牌数

原题链接

算法标签 哈希

思路 由于数据范围为10^5,故该题暴力枚举会超时, 采用hash表记录出现次数,若已出现,则将答案更新为原答案与本次最近距离的最小值。

代码

class Solution {
public:
    int minimumCardPickup(vector& cards) {
        /* map存数值cards[i]出现的最近一次下标 */
        unordered_map map;
        int result = INT_MAX;
        for(int i = 0; i < cards.size(); i++){
            if(map.count(cards[i]))
                result = min(result,i - map[cards[i]] + 1);
            map[cards[i]] = i;
        }
		return result == INT_MAX ? -1 : result;
    }
};

2261. 含最多 K 个可整除元素的子数组

原题链接

算法标签 枚举 哈希

思路

为了方便起见,我们可以首先考虑子数组不会重复出现的情况。
对于一个确定的整数数组 nums,它的子数组可以由左边界和右边界唯一决定。因此我们可以通过枚举左边界和右边界来遍历 nums 的所有子数组,并检查它们是否至多含 k 个可被 p 整除的元素。
具体地,我们用res 来维护符合要求子数组的个数。我们首先枚举左边界 i,对于某个左边界 i,我们在枚举右边界 j 的同时用 cnt 统计子数组 nums[i…j](闭区间)中可被 p 整除的元素的个数。cnt 的初值为 0,如果nums[j] 可以被 p 整除,则我们将 cnt 加上 1。此时根据 cnt 和 k 的大小关系,有两种情况:
如果此时cnt≤k,则说明子数组 nums[i…j] 符合要求,我们将 res 加上 1,并继续枚举右边界;
如果此时 cnt>k,则说明子数组 nums[i…j] 不符合要求,同时后续即将遍历到的满足 j1 > j
​的子数组 nums[i…j 1] 由于包含 nums[i…j] 显然也不符合要求,因此我们可以停止枚举右边界。
最终我们返回 res 作为答案即可。
随后我们考虑子数组会重复出现的情况。此时我们不能直接按照上文的方法统计个数,而需要对符合要求的子数组进行去重后计算。
我们可以用哈希集合来完成对应的去重操作。具体地,我们用哈希集合arrs 来维护符合要求的子数组,按照与上文一致的遍历方法进行遍历,每当遍历到符合要求的子数组,我们将该子数组序列化(即通过一一映射转化为可哈希的元素)并放入哈希集合中。最终,我们返回 arrs 中的元素个数作为答案。
对于序列化的具体方式,对于 Python 等语言,我们可以将子数组转化为可哈希的元组放入哈希表;而对于 C++ 等语言,我们可以将子数组转化为字符串后放入哈希表。
具体地,我们用 s 表示序列化后的字符串。在每次开始遍历右边界前,我们初始化字符串。当遍历到对应下标时,我们将右边界对应的元素转化为字符串,并在末尾加上分隔符 ‘#’ 后添加进 s 的尾部。可以证明,上述的序列化方式是一一映射。(该题解来自官方)

代码

class Solution {
public:
    int countDistinct(vector& nums, int k, int p) {
        unordered_set arrs;   // 不同的(序列化后)子数组
        int n = nums.size();
        // 枚举左右边界
        for (int i = 0; i < n; ++i) {
            int cnt = 0;   // 当前被 p 整除的元素个数
            string s;   // 当前子数组序列胡后的字符串
            for (int j = i; j < n; ++j) {
                if (nums[j] % p == 0) {
                    ++cnt;
                    if (cnt > k) {
                        break;
                    }
                }
                // 序列化后放入哈希集合
                s.append(to_string(nums[j]));
                s.push_back('#');
                arrs.insert(s);
            }
        }
        return arrs.size();
    }
};

2262. 字符串的总引力

原题链接

算法标签 DP

题解

代码

class Solution {
public:
    long long appealSum(string &s) {
        long ans = 0L;
        vector last(26, -1);
        for (int i = 0, sum_g = 0; i < s.length(); ++i) {
            char c = s[i] - 'a';
            sum_g += i - last[c];
            ans += sum_g;
            last[c] = i;
        }
        return ans;
    }
};

原创不易 转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈Leetcode第 291 场周赛_第1张图片

你可能感兴趣的:(LeetCode,leetcode,哈希算法,散列表)