IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode第302场周赛 -> 正文阅读

[数据结构与算法]LeetCode第302场周赛

第 302 场周赛

我走得很慢!但我从不后退!

6120. 数组能形成多少数对

在这里插入图片描述

思路:
如果元素成对出现,那么一定能被2整除,因此,我们把数组中出现的数字的个数存储下来,然后遍历map,对map中个元素进行除2操作,能被2整除的即是start,不能被2整除的就是剩余的元素个数。

class Solution {
public:
    vector<int> numberOfPairs(vector<int>& nums) {
       map<int,int> mp;
       for(int i=0;i<nums.size();i++){mp[nums[i]]++;}
       int start=0,end=0;
       for(auto&[x,y]:mp){
           //cout<<y<<"-";
           start+=y/2;
           end += y%2;
       } 
       return vector<int>{start,end};
    }
};

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

在这里插入图片描述

思路:
1.求每个数的数位和
2.map存数位和以及当前数位和下的最大数字(贪心)
3.更新答案。

class Solution {
public:
    int maximumSum(vector<int>& nums) {
        //这样子的map是关键
        unordered_map<int,vector<int>>mp;
        // 计算每个数的数位和并放入 map
        for (int x : nums) {
            int t = 0;
            for (int y = x; y; y /= 10) t += y % 10;
            //对应位数和下所存储的数组
            mp[t].push_back(x);
        }
        int ans=-1;
        for(auto it=mp.begin();it!=mp.end();it++){
            //如果当前位数和下的数组长度大于一
            if(it->second.size()>1){
                //进行排序,优先取最大的两个进行相加
                sort(it->second.begin(),it->second.end());
                int sz=it->second.size();
                //取整体最大的
                ans=max(ans,it->second[sz-1]+it->second[sz-2]);
            }
        }
        return ans;
    }
};

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

在这里插入图片描述

思路:
本题的核心是将裁剪后的字符串以及对应的下标绑定起来,然后进行一个排序,因此可以用pair来存储裁剪后的字符串以及对应的下标信息,再通过vector进行排序。

  1. 首先,遍历queries,得到k和trim
  2. 然后再次基础上遍历nums,得到对应截取后的字符串以及下标,存入vector<pair<string,int>>当中
  3. 对vector<pair<string,int>>进行排序
  4. 最后,找到 nums 中第 ki 小数字对应的下标
class Solution {
public:
    vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
        vector<int> ans(queries.size(),0);
        //记录每个字符串的长度为多少
        int nSize = nums[0].size();
        //循环遍历query
        for(int i=0;i<queries.size();i++){
            //得到二维数组中每一行的k和trim
            int k = queries[i][0];
            int trim=queries[i][1];
            //存取截取的数,以及其下标
            vector<pair<string,int>> t(nums.size());
            //遍历nums,存取截取后的字符串以及对应的下标
            for(int j=0;j<nums.size();j++){
                //string为截取的字符串,int为对应的下标
                t[j] = make_pair(nums[j].substr(nSize-trim),j);
            }
            //对vector<pair<string,int>>类型进行排序,这样即可不丢失下标
            //当元素是pair时,vector默认的排序是string比大小
            sort(t.begin(),t.end());
          /*  for(int j=0;j<nums.size();j++){
               cout<<t[j].first<<":"<<t[j].second<<endl;
            }*/
            //找 nums 中第 ki 小数字对应的下标
            ans[i] = t[k-1].second;
        }
        return ans;
    }
};

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

在这里插入图片描述

思路:
能被一堆数整除就是能被这堆数的最大公约数整除

  1. 首先找到numsDivide中的最大公因子
  2. 在nums(排序好之后)中寻找是否有符合numsDivide中的最大公因子相等的元素(即能够整除的元素),如果有就返回下标。(这就是利用排序之后的好处,这样既可得到最小的删除次数)
class Solution {
public:
    int minOperations(vector<int>& nums, vector<int>& numsDivide) {
        int g=0;
        //求出numsDivide 中最大的公因子
        for(int x:numsDivide){
            g=gcd(g,x);
        }
        //cout<<g<<endl;
        //对nums进行排序
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++){
            //如果在nums中找到和g相等的元素,就返回当前下标(即最少删除次数)
            if(g%nums[i]==0)return i;
        }
        return -1;
    }
};

总结

本次周赛难度总体来说其实并不大(相比前几次),但是做的不咋地。
反思总结有以下的问题:
1.对于stl库中map,pair这类并没有很常用,操作起来有点生疏
2.最近一周在外面玩,做题的感觉好像无了(自己菜,还找借口)
3.t1主要是从别的角度考虑(奇偶能否被整除);t2 模拟+贪心,但是是通过 unordered_map<int,vector>mp;来存储数组,之前都是map<int,int>这种;需要学习一下;t3模拟,使用vector<pair<string,int>>来存储剪裁的字符串以及下标,方便排序;t4能被一堆数整除就是能被这堆数的最大公约数整除;使用到gcd的函数

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:10:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:19:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码