力扣第 306 场周赛复盘
1. 矩阵中的局部最大值
题目描述
题目分析
简单模拟题,这道题数据范围不大,所以只需要模拟即可
AC代码
class Solution { public: int findmax(vector<vector<int>>& grid,int x,int y) { int cur=0; for(int i=x;i<x+3;i++) for(int j=y;j<y+3;j++) cur=max(cur,grid[i][j]); return cur; } vector<vector<int>> largestLocal(vector<vector<int>>& grid) { int n=grid.size(); vector<vector<int>> res; for(int i=0;i<n-2;i++) { vector<int> tmp; for(int j=0;j<n-2;j++) tmp.push_back(findmax(grid,i,j)); res.push_back(tmp); } return res; } };
2. 边积分最高的节点
题目描述
题目分析
只需要遍历一遍,将每个点的边积分求出来即可,然后求出最大值。 注意:不能用unordered_map这是无序的,注意longlong
AC代码
class Solution { public: int edgeScore(vector<int>& edges) { map<int,long long> hash; for(int i=0;i<edges.size();i++) hash[edges[i]]+=i; int maxi=-1,maxn=-1; for(auto it:hash) { if(it.second>maxn)maxi=it.first,maxn=it.second; } return maxi; } };
3. 根据模式串构造最小数字
题目描述
题目分析
思路:贪心 假设区间全是升序,那么我们从小到大排序即可 如果有降序呢?那么我们将应该降序的区间的升序全部变成降序即可。 这样可以保证所得的数字最小。
AC代码
class Solution { public: string smallestNumber(string pattern) { int n=pattern.size(); string res; for(int i=1;i<=n+1;i++)res+=i+0;// 从小到大 int pre=-1; for(int i=0;i<=n;i++) { if(pattern[i]==I)pre=i; if(pattern[i]==D&&(i==n-1||pattern[i+1]!=D)) { int l=pre+1,r=i+1;// 找出交换区间 if(i==n)r=i; while(l<r)swap(res[l],res[r]),l++,r--;// 交换 i++; pre=i; } } return res; } };
4. 统计特殊整数
题目描述
题目分析
数位DP,没有接触过,后续补充
AC代码
总结感想
前两道题都是比较简单,第三题当时想到方法,但是实现有bug找了半天,而且其实代码也很杂,后续通过画图很轻松就知道怎么写了(以后要多画图),最后一道题其实一读就知道是数位DP,但是自己不会(其实碰到很多次,都没认真做过)。 多刷题,多总结,多画图,多反思!!!