第一题
解题思路:
多重for循环遍历得到每个3x3
矩阵中的最大值
class Solution
{
public:
vector<vector<int>> largestLocal(vector<vector<int>>& grid)
{
int n=grid.size();
vector< vector<int> > maxLocal(n-2,vector<int>(n-2,0));
for(int i=0;i<=n-3;i++)//maxLocal数组有n-2行
for(int j=0;j<=n-3;j++)//maxLocal数组有n-2列
{
int ma_x=0;
for(int k=i;k<=i+2;k++)
ma_x=max(ma_x,*max_element(grid[k].begin()+j,grid[k].begin()+j+3));
//注意max_element的使用
//ma_x最终为行[i,i+2]、列[j,j+3)的3x3矩阵中的最大值
maxLocal[i][j]=ma_x;
}
return maxLocal;
}
};
class Solution
{
public:
vector<vector<int>> largestLocal(vector<vector<int>>& grid)
{
int n=grid.size();
vector< vector<int> > maxLocal(n-2,vector<int>(n-2,0));
for(int i=0;i<=n-3;i++)//maxLocal数组有n-2行
for(int j=0;j<=n-3;j++)//maxLocal数组有n-2列
{
int ma_x=0;
for(int k=i;k<=i+2;k++)
for(int l=j;l<=j+2;l++)
ma_x=max(ma_x,grid[k][l]);
//ma_x最终为行[i,i+2]、列[j,j+2]的3x3矩阵中的最大值
maxLocal[i][j]=ma_x;
}
return maxLocal;
}
};
第二题
解题思路:
首先统计每个节点的边积分,然后选择出边积分最高的节点
class Solution
{
public:
int edgeScore(vector<int>& edges)
{
int n=edges.size();
vector<long long> S(n,0);
//注意long long的使用;S[i]表示节点i的边积分
for(int i=0;i<n;i++)
S[edges[i]]+=i;
int ma_x=0;
for(int i=0;i<n;i++)//从小到大遍历编号
if(S[i]>S[ma_x])
ma_x=i;
//如果多个节点的边积分相同,返回编号最小的那个
//所以当S[i]==S[ma_x],无需ma_x=i
return ma_x;
}
};
第三题
解题思路:
全排列函数next_permutation()
按照字典序从小到大尝试每一种可能
class Solution
{
public:
string smallestNumber(string pattern)
{
string num;
int n=pattern.size();
for(int i=1;i<=n+1;i++)
num+=to_string(i);
//首先生成长度为n+1且字典序最小的无重复数字的字符串num
while(true)
{
bool f=true;
for(int i=0;i<n;i++)
{
if(pattern[i]=='I' && num[i]>num[i+1])
{f=false; break;}
if(pattern[i]=='D' && num[i]<num[i+1])
{f=false; break;}
//如果当前字符串num没有满足题设要求,那么f=false且break
}
if(f) break;
//如果f==true,那么已经找到了满足题设要求的字符串num
next_permutation(num.begin(),num.end());
//注意next_permutation的使用
//如果f==false,那么接着尝试字典序下一个全排列
}
return num;
}
};