LeetCode498 對角線遍歷
阿新 • • 發佈:2018-12-03
給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。
示例:
輸入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 輸出: [1,2,4,7,5,3,6,8,9] 解釋:
說明:
- 給定矩陣中的元素總數不會超過 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; } };