第34天(简单题&中等题 数据结构)

打卡第三十四天
1道简单题+两道中等题
image

题目:
image

思路:哈希表+遍历

代码:

class Solution{
public:
    int maxSum(vector<int>& nums){
        unordered_map<int,int> hash;
        int ans = -1;
        for(int x: nums){
            int maxdigit = 0;//初始化当前数字的最大位数为0
            int num = x;// 用临时变量处理,避免修改原数字
            while(num > 0){
                maxdigit = max(maxdigit,num % 10);// num % 10 得到最后一位数,比较取最大值
                num /= 10;// 去掉最后一位数,处理下一位
            }
            if(hash.count(maxdigit)){ // 哈希表中是否已经存在相同最大数字的键
                ans = max(ans,x + hash[maxdigit]);// 计算当前数字与该分组中最大值的和并与当前答案比较,取较大值更新答案
            }
           hash[maxdigit] = max(hash[maxdigit],x);//更新哈希表,确保存储的是该分组的最大值
       }
            return ans;
    }

题目:
image

思路:哈希表统计每个数字出现的次数,对每个数字key找互补数字(k - key),统计较少数量的数字出现次数

代码:

class Solution {
public:
    int maxOperations(vector<int>& nums, int k) {
        int ans = 0;
        unordered_map<int,int> hash;
        int n = nums.size();
        for(int num : nums){// 第一次遍历:统计每个数字出现的频率
            hash[num]++;
        }
        for(auto [key,value]: hash){// 第二次遍历:遍历哈希表中的所有键值对
            if(key * 2 == k){
                ans += value / 2;// 同一个数字需要两个才能组成一对,所以取出现次数的一半
            }
            else if(key * 2 < k && hash.count(k - key)){// 当前数字小于k/2,并且存在互补数字(k - key)
                ans += min(value,hash[k - key]);// 取当前数字和互补数字出现次数的较小值
            }
        }
        return ans;
    }
};

耗时≈一小时 明天继续

posted @ 2025-11-23 23:56  Wy0518  阅读(2)  评论(0)    收藏  举报