1.螺旋矩阵
1)将螺旋矩阵当作一个框,规定上下左右边界:
上:0
下:m.size()-1
左:0
右:m[0].size()-1
2)返回条件:上边界>下边界 || 左边界>右边界
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
//一定要考虑到空的情况
if(matrix.size()==0) return ans;
int u=0,d=matrix.size()-1;
int l=0,r=matrix[0].size()-1;
int max=matrix.size()*matrix[0].size();
//一直循环
while(true){
for(int i=l;i<=r;i++){
ans.push_back(matrix[u][i]);
}
if(++u>d)break;
for(int i=u;i<=d;i++){
ans.push_back(matrix[i][r]);
}
if(l>--r)break;
for(int i=r;i>=l;i--){
ans.push_back(matrix[d][i]);
}
if(u>--d)break;
for(int i=d;i>=u;i--){
ans.push_back(matrix[i][l]);
}
if(++l>r)break;
}
return ans;
}
};
2.矩阵置零
1)记录等于0的元素所在行所在列
2)再将该行该列元素全部置零
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<int> row,col;
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(matrix[i][j]==0){
//insert也可
row.push_back(i);
col.push_back(j);
}
}
}
//vector<int>iterator it;也可
for(auto it=row.begin();it!=row.end();++it){
for(int i=0;i<matrix[0].size();i++){
//*it就是迭代器it指向的元素
matrix[*it][i]=0;
}
}
for(auto it=col.begin();it!=col.end();++it){
for(int i=0;i<matrix.size();i++){
matrix[i][*it]=0;
}
}
}
};
3.使数组唯一的最小增量
1)排序(当你一脸懵逼不知道干啥的时候,就先排序,万能排序)
2)当后面的数小于等于前面的数,就不停加一,直到大于前一个数
class Solution {
public:
int minIncrementForUnique(vector<int>& A) {
//注意特殊情况
if(A.size()<=1) return 0;
sort(A.begin(),A.end());
int n=0;
for(auto it=A.begin();it!=A.end()-1;++it){
if(*it>=*(it+1)){
//前一个数与当前数的差值可能大于1,所以要*it+1
int temp=*(it+1);
*(it+1)=*it+1;
n+=*it-temp+1;
}
}
return n;
}
};
conclusion:数组这里需要注意边界,包括题目中的边界和数组为空的情况,尽量观察规律,不会就排序。