解法很巧妙,你会发现每一条对角线的和依次递增,从0开始,第一趟是认为是从下向上进行遍历,第二次是从上到下,那么也就相当于第一趟是x由大到小,y由小到大;第二趟是y由大到小,x由小到大,这样依次变化,那么我们只要找到每次遍历时,x和y的界限就可以,且x+y的值为依次从0开始递增的和。所以x,y的初始值也找到了
#include#include using namespace std; vector findDiagonalOrder(vector >& mat) { int m = mat.size(); int n = mat[0].size(); vector nums; if(m == 0 || n == 0){ return nums; } int i = 0; while(i < m + n){ // 第1,3,5趟,x由大到小,y由小到大 int x1 = (i < m) ? i : m - 1; int y1 = i - x1; while(x1 >= 0 && y1 < n){ nums.push_back(mat[x1][y1]); x1--; y1++; } i++; if(i >= m + n){ break; } // 第2,4,6趟,x由小到大,y由大到小 int y2 = (i < n) ? i : n - 1; int x2 = i - y2; while(x2 < m && y2 >= 0){ nums.push_back(mat[x2][y2]); x2++; y2--; } i++; } return nums; } int main(){ int m, n; cin>>m>>n; vector > mat(m, vector (n)); vector res; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cin>>mat[i][j]; } } res = findDiagonalOrder(mat); for(int i = 0; i < res.size(); i++){ cout<



