LeetCode 498. Diagonal Traverse
原题链接在这里:https://leetcode.com/problems/diagonal-traverse/
题目:
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.
Example:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,4,7,5,3,6,8,9] Explanation:
Note:
The total number of elements of the given matrix will not exceed 10,000.
题解:
The result size should be m*n.
For each value, when r + c is even, index in matrix is moving right up. First check if it is hitting right, if yes, move down. Then check if it is hitting up, if yes, move right. Otherwise move right up.
When r + c is odd, index in matrix is moving left down.First check if it is hitting down, if yes, move right. Then check if it is hitting left, if yes, move down. Otherwise move left down.
Think this as when it hit the corner, which direction it would move first.
Time Complexity: O(m*n). m = matrix.length. n = matrix[0].length.
Space: O(1). regardless res.
AC Java:
1 class Solution { 2 public int[] findDiagonalOrder(int[][] matrix) { 3 if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ 4 return new int[0]; 5 } 6 7 int m = matrix.length; 8 int n = matrix[0].length; 9 int [] res = new int[m*n]; 10 int r = 0; 11 int c = 0; 12 for(int i = 0; i<m*n; i++){ 13 res[i] = matrix[r][c]; 14 15 if((r + c) % 2 == 0){ 16 if(c == n-1){ 17 r++; 18 }else if(r == 0){ 19 c++; 20 }else{ 21 r--; 22 c++; 23 } 24 }else{ 25 if(r == m - 1){ 26 c++; 27 }else if(c == 0){ 28 r++; 29 }else{ 30 r++; 31 c--; 32 } 33 } 34 } 35 36 return res; 37 } 38 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步