摘要:對角線遍歷給定一個含有個元素的矩陣行,列,請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。此時且均超出范圍,,應當優先判斷是否超出范圍,執行,避免因為再次切換一次索引改變方式。避免出現同時小于時布爾值轉換兩次的錯誤。
對角線遍歷
給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。
Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
示例:
輸入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 輸出: [1,2,4,7,5,3,6,8,9]
解釋:
說明:
給定矩陣中的元素總數不會超過 100000 。
思路:
? 實例輸入的二維數組范圍均是0~2
? 先觀察一下遍歷規律:(0,0)->(0,1)->(1,0)->(2,0)->(1,1)->(0,2)->(1,2)->(2,1)->(2,2)
? 數組索引(m,n),兩種改變方式1、(m-1,n+1) 2、(m+1,n-1)
? 數組從(0,0)開始,先是(m-1,n+1) ,(0,0)->(-1,1)此時m=-1,超出范圍,m賦值0。然后切換索引改變方式(m+1,n-1),執行兩次(0,1)->(1,0)->(2,-1),n賦值0得到(2,0),再次切換為索引改變方式(m-1,n+1)直到下次超出范圍(2,0)->(1,1)->(0,2)->(-1,3)。此時m<0且n>2均超出范圍,(m+2,n-1),應當優先判斷n是否超出范圍,執行(m+2,n-1)->(1,2),避免因為m<0再次切換一次索引改變方式。然后正常切換后:(1,2)->(2,1)->(3,0),因為m>2,切換方式并(m-1,n+2)
java:
class Solution { public int[] findDiagonalOrder(int[][] matrix) { if (matrix.length==0||matrix[0].length==0)return new int[0]; int col=matrix.length,row=matrix[0].length; int nums=col*row,m=0,n=0; int res[]=new int[nums]; boolean flag=true; for(int i=0;i注意點:=col){ m-=1; n+=2; flag=true; }else if(n>=row){ n-=1; m+=2; flag=false; } if(m<0){ m=0; flag=false; }else if(n<0){ n=0; flag=true; } } return res; } }
? if (matrix.length==0||matrix[0].length==0)return new int[0];首先判斷是否為空數組,另外 matrix.length==0||matrix[0].length==0 判斷條件順序不能顛倒,因為如果 matrix.length==0 后面的 matrix[0].length==0 不會再判斷,即返回空數組;但是matrix[0].length==0 在前時,如果輸入數組為空,matrix[0] 會報錯因為matrix并沒有0號索引。
? for循環里應當先判斷m、n是否大于或等于各自的最大長度,然后執行(m-1,n+2)、(m+2,n-1)。避免出現m、n同時小于0時flag布爾值轉換兩次的錯誤。
python:class Solution: def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]: if(len(matrix)==0 or len(matrix[0])==0): return [] col=len(matrix) row=len(matrix[0]) nums=col*row m=n=0 flag=True res=[] for i in range(nums): res.append(matrix[m][n]) if flag: m-=1 n+=1 else: m+=1 n-=1 if m>=col: m-=1 n+=2 flag=True elif n>=row: m+=2 n-=1 flag=False if m<0: m=0 flag=False elif n<0: n=0 flag=True return res
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43949.html
摘要:對角線遍歷給定一個含有個元素的矩陣行,列,請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。此時且均超出范圍,,應當優先判斷是否超出范圍,執行,避免因為再次切換一次索引改變方式。避免出現同時小于時布爾值轉換兩次的錯誤。 對角線遍歷 給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。Given ...
摘要:題目要求思路和代碼其實這道題目不難,只要捋清楚一些邊界的場景即可。自上而下遍歷數組時,一定是自右往左移動的,因此下標移動的方向為。自上而下有兩種邊界場景,一個是到達了左邊界,此時的移動方向變為即上圖中的。 題目要求 Given a matrix of M x N elements (M rows, N columns), return all elements of the matri...
Diagonal traverse 題目鏈接:https://leetcode.com/contest/... 就是找index的規律。。 public class Solution { public int[] findDiagonalOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || ma...
摘要:題目詳情如果一個矩陣的每一條斜對角線左上到右下上的元素都相等,則我們稱它為托普利茲矩陣。現在輸入一個大小的矩陣,如果它是一個托普利茲矩陣,則返回,如果不是,返回。 題目詳情 matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.Now given an M x N ...
摘要:雙重循環復雜度時間空間思路總共需要打印的層數,是長度加寬度減去一。關鍵在于內層的,而。代碼計算打印的層數超過邊界的點直接跳過 Print Matrix Diagonal Print the matrix in diagonal way. For example: 1 2 3 4 5 6 7 8 Print: 1 2 5 6 3 4 7 8 雙重循環 復雜度 時間 O(NM) 空間...
閱讀 3428·2021-11-19 09:40
閱讀 1314·2021-10-11 11:07
閱讀 4844·2021-09-22 15:07
閱讀 2890·2021-09-02 15:15
閱讀 1964·2019-08-30 15:55
閱讀 539·2019-08-30 15:43
閱讀 883·2019-08-30 11:13
閱讀 1449·2019-08-29 15:36