力扣302场周赛补题

1.题目:2341. 数组能形成多少数对 - 力扣(LeetCode)

   思路:排序,看前一个是否等于后一个,相等形成数对并变成-1.后续根据数组中不是-1的数计算剩余的数个数

class Solution {
public:
    vector<int> numberOfPairs(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int res = 0, count = 0;
        for(int i = 0;i < nums.size() - 1; i ++ ){
            if(nums[i] == nums[i+1]){
                nums[i] = -1;
                nums[i+1] = -1;
                res++;
            }
        }
        for(int i = 0; i < nums.size(); i ++ ){
            if(nums[i] != -1) 
            count ++;
        }
        return { res, count };
    }
};

2.题目:2342. 数位和相等数对的最大和 题解 - 力扣(LeetCode)

   思路:使用key和value的值进行串联,通过不断的比较更新最大和,key表示数位和,value记录下标

class Solution {
public:
    int fun(int x) {
        int y = 0;
        while(x) 
        {
           int z = x % 10;
           y += z;
           x /= 10;
        }
        return y;
    }
    int maximumSum(vector<int>& nums) {
        int res = 0;
        unordered_map<int, int>map; //key表示fun(n),value记录下标
        for(int i = 0; i < nums.size(); ++i) {
            int key = fun(nums[i]);
            if(map.count(key)) {
                //出现数位和相等,记录前一key值的下标,方便从数组中访问
                int value = map[key];
                //记录此次数位和相等数对和
                int sum = nums[i] + nums[value];
                //更新结果最大值
                res = max(res, sum);
                if(nums[i] > nums[value])
                //数位和相等时,第二次出现数组元素值大于之前数组元素值,更新key值对应的value为当前数组下标
                    map[key] = i;
            }else{  map[key] = i; }
        }
        if(res == 0) return -1;
        else         return res;
    }
};

3.题目:2343. 裁剪数字后查询第 K 小的数字 - 力扣(LeetCode)

   思路:先遍历queri来找到每次的k和trim,再针对每次的trim进行裁剪,同时把裁剪后的字符串与角标进行关联,最后通过对前者的排序来找到第k小字符串的角标

class Solution {
public:
    vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
        vector<int> ans(queries.size(),0);
        int nSize = nums[0].size();
        for(int i=0;i<queries.size();i++){
            int k = queries[i][0];
            int trim=queries[i][1];                  //获取k值和trim值
            vector<pair<string,int>> t(nums.size()); 
            for(int j=0;j<nums.size();j++){
                t[j] = make_pair(nums[j].substr(nSize-trim),j);  //关联截取后的字符串与其下标
            }
            sort(t.begin(),t.end());    //对前面的元素进行排序
            ans[i] = t[k-1].second;     //把角标赋给结果数组
        }
        return ans;
    }
};

4.题目:2344. 使数组可以被整除的最少删除次数 - 力扣(LeetCode)

   思路:先求出numsDivide中所有数的最大公因数res,对nums进行排序,按顺序判断是否能整除res,不能整除则删除当前数往后判断

class Solution {
public:
    int gcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        return gcd(b, a % b);
    }
    // 求最大公因数
    int minOperations(vector<int>& nums, vector<int>& numsDivide) {
        int res = numsDivide[0];
        for (int i = 1; i < numsDivide.size(); i++) {
            res = gcd(res, numsDivide[i]);
        }
        // 求得所有numsDivide的最大公因数
        sort(nums.begin(), nums.end());
        int cnt = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (res % nums[i] == 0) {
                return cnt;
            }
            cnt++;
            // 从小到大如果不能整除,则删除次数+1,进入下一次判断
        }
        return -1;
        // if条件没有满足,返回-1
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值