目录
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,但是自己不会(其实碰到很多次,都没认真做过)。
多刷题,多总结,多画图,多反思!!!