365天挑战LeetCode1000题——Day 032 千挂科技全解

本文分别探讨了四个不同的算法问题:数组中数对的计算、数位和相等数对的最大和、裁剪数字后的第K小数字查询以及使数组可被整除的最小删除次数。通过实例解析,展示了如何运用编程技巧解决这些问题,涉及数据结构和算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


6120. 数组能形成多少数对

在这里插入图片描述

首刷自解

class Solution {
public:
    vector<int> numberOfPairs(vector<int>& nums) {
        set<int> s;
        vector<int> ans;
        for (int num : nums) {
            if (!s.count(num)) {
                s.emplace(num);
            }
            else {
                s.erase(num);
            }
        }
        int first = (nums.size() - s.size()) / 2;
        int second = s.size();
        ans.push_back(first);
        ans.push_back(second);
        return ans;
    }
};

6164. 数位和相等数对的最大和

在这里插入图片描述

首刷自解

class Solution {
public:
    int maximumSum(vector<int>& nums) {
        map<int, vector<int>> m;
        for (int num : nums) {
            int n = 0;
            int nu = num;
            while (nu != 0) {
                n += nu % 10;
                nu /= 10;
            }
            m[n].push_back(num);
        }
        int ans = -1;
        for (auto it = m.begin(); it != m.end(); it++) {
            if (it->second.size() < 2) continue;
            sort(it->second.begin(), it->second.end());
            ans = max(ans, it->second.back() + it->second[it->second.size() - 2]);
        }
        return ans;
    }
};

6121. 裁剪数字后查询第 K 小的数字

在这里插入图片描述

首刷自解

class Solution {
public: 
    vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
        int n = nums[0].size();
        vector<vector<pair<string, int>>> helper(n);
        vector<int> ans;
        for (vector<int> query : queries) {
            int start = n - query[1];
            if (!helper[start].empty()) {
                ans.push_back(helper[start][query[0] - 1].second);
                continue;
            }
            for (int i = 0; i < nums.size(); i++) {
                helper[start].push_back(make_pair(nums[i].substr(start), i));
            }
            sort(helper[start].begin(), helper[start].end());
            ans.push_back(helper[start][query[0] - 1].second);
        }
        return ans;
    }
};

6122. 使数组可以被整除的最少删除次数

在这里插入图片描述

首刷自解

class Solution {
public:
    int minOperations(vector<int>& nums, vector<int>& numsDivide) {
        map<int, int> _map;
        sort(nums.begin(), nums.end());
        for (int num : nums) _map[num]++;
        int count = 0;
        int n = nums.size();
        int i = 0;
        // auto iter = _map.begin();
        int ans = 0;
        while (i < n) {
            bool flag = true;
            for (int numDivide : numsDivide) {
                if (numDivide % nums[i] == 0) continue;
                else {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                break;
            }
            else {
                ans += _map[nums[i]];
                i += _map[nums[i]];
            }
        }
        return ans == n ? -1 : ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值