给你一个大小为 m x n
的矩阵 mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
思路:找规律,对角线遍历可以发现,一条线上横纵坐标之和是相等的,并且和的最大值为横列数相关(for循环遍历),右上或者左下遍历过程中,可以发现为横坐标或者纵坐标为单增序列(设计个sign判断),只不过需要约束起始点和上限(if 判断语句)
!!!提示:矩阵不一定是方针,所以考虑的时候不能只考虑方阵(我就天真以为啦!!!)
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
int coordinata_sum = mat.size() + mat[0].size() - 2;
int sign = 0;
vector<int> result;
result.push_back(mat[0][0]);
for (int i = 1; i <= coordinata_sum; i++){
if (sign == 0){
for (int row_num = 0; row_num <= mat.size()-1; row_num++){
if ((i - row_num) < mat[0].size()){
result.push_back(mat[row_num][i-row_num]);
}
}
sign = 1; // change the sign
}
else{
for (int col_num = 0; col_num <= mat[0].size()-1; col_num++){
if ((i - col_num) < mat.size()){
result.push_back(mat[i-col_num][col_num]);
}
}
sign = 0; // change the sign
}
}
return result;
}
};
int main(){
// vector<vector<int>> mat = {{1,2,3},{4,5,6},{7,8,9}};
vector<vector<int>> mat = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// vector<vector<int>> mat = {{2,3}};
Solution s;
vector<int> result = s.findDiagonalOrder(mat);
for (int i = 0; i < result.size(); i++){
cout << result[i] << " ";
}
return 0;
}