题目:
思路:
①先从最简单的出发,每条对角线(↗)输出
②发现这些对角线的出发点都在第一列和最后一行上
③第偶数条对角线要逆序输出
代码:
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
int num_row = matrix.length;
if(num_row == 0){
int[] aa =new int[0];
return aa;
}
int num_column = matrix[0].length;
ArrayList<Integer> ans = new ArrayList<>();
//所有对角线的起点都在第一列和最后一行上
//遍历第一列的起点
int count = 0;
for(int i = 0; i < num_row; i++){
ArrayList<Integer> temp = new ArrayList<>();
int row = i;
int column = 0;
while(row >= 0 && column < num_column){
temp.add(matrix[row][column]);
row--;
column++;
}
count++;
if(count % 2 != 0)
ans.addAll(temp);
else{
Collections.reverse(temp);
ans.addAll(temp);
}
}
//遍历最后一行的起点
for(int i = 1; i < num_column; i++){
ArrayList<Integer> temp = new ArrayList<>();
int column = i;
int row = num_row - 1;
while(row >= 0 && column < num_column){
temp.add(matrix[row][column]);
row--;
column++;
}
count++;
if(count % 2 != 0)
ans.addAll(temp);
else{
Collections.reverse(temp);
ans.addAll(temp);
}
}
int[] final_ans = new int[ans.size()];
for(int i = 0; i < ans.size();i++){
final_ans[i] = ans.get(i);
}
return final_ans;
}
}
复杂度分析:
时间复杂度: O(M*N)
空间复杂度: O(MIN(M,N))
知识点
①arraylist中增加元素x: arraylist.add(x)
②arraylist中增加数组x: arraylist.addAll(x)
③arraylist要反转的话要调用Collections :
Collections.reverse(arraylist)
④想事情要由简到繁!!!