1. 程式人生 > >LeetCode498 對角線遍歷

LeetCode498 對角線遍歷

給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。

 

示例:

輸入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

輸出:  [1,2,4,7,5,3,6,8,9]

解釋:

 

說明:

  1. 給定矩陣中的元素總數不會超過 100000 。

 


 

 

 

//章節 - 陣列和字串    
//二、二維陣列簡介
//1.對角線遍歷
/*
演算法思想:
    有類題屬於直觀上很好理解,但是寫起來卻不知如何下手。這題就屬於此類。
    這道題好處是給了一個圖例,而圖例又不像另一種4向(右,左下,下,右上)畫法讓人誤導,而是對角線,方向是右上、左下依次交替。因此,只需確定每條對角線的起點,由起點向右上延伸直到邊界,再根據當前所在的行數判斷是否需要逆序即可。每行的起始點如下:從[0,0]向下延伸到[m-1,0],再向右延伸到[m-1][n-1]

*/ //演算法實現: class Solution { public: vector<int> findDiagonalOrder(vector<vector<int>>& matrix) { vector<int> result; int m = matrix.size(); if(m == 0) return result; int n = matrix[0].size(); if(n == 0)
return result; for(int i = 0, j = 0; i+j < m+n-1; ) { // 起點位置(0,0)->(m-1,0)->(m-1,n-1),然後每個起點右上延伸直到邊界,每隔一行翻轉一下 vector<int> tmp; bool bflag = (i+j) & 0x01; if(i < m) { for(int x = i, y = 0; x>=0 && y<n; x--,y++) { tmp.push_back(matrix[x][y]); } i
++; } else if(i >= m) { for(int x = i-1, y = j+1; x>=0 && y<n; x--,y++) { tmp.push_back(matrix[x][y]); } j++; } if(bflag) { // bflag需要判斷i+j,但是由於上面i和j已經累加了,所以要用bflag判斷 reverse(tmp.begin(), tmp.end()); } result.insert(result.end(), tmp.begin(), tmp.end()); } return result; } };