题目描述1
笔者解答1.1
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
//m行n列
int m=nums.size();
int sum=0;
int i;
for(i=0;i<m;i++){
int temp=nums.get(i).size();
sum+=temp;
}
int[] last_index=new int[m];
for(i=0;i<m;i++)last_index[i]=0;
int[] result=new int[sum];
int count=0;
int begin=0;
while(count<sum){
for(i=begin;i>=0;i--){
if(last_index[i]!=nums.get(i).size()){
result[count]=nums.get(i).get(last_index[i]);
count++;
last_index[i]++;
}
}
if(begin!=m-1){
begin++;
}
while(last_index[begin]==nums.get(begin).size())
{
begin--;
if(begin<=0)break;
}
}
return result;
}
}
笔者分析1.2
这次的代码56个用例通过了53个,最后几个超时了,其实我感觉复杂度也不高啊,而且也没有多余累赘的代码,但还超时了,只能说方法不行了,我是想不到还能怎样优化了,上评论区,直接用API是真强,学到了学到了。给每个链表拆成零碎的点,自定义给点排序,强。
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
List<int[]> list = new ArrayList<>();
for (int i = 0; i < nums.size(); i++){
for (int j = 0; j < nums.get(i).size(); j++){
list.add(new int[]{
i, j});
}
}
list.sort((o1, o2) -> {
if (o1[0] + o1[1] - o2[0] - o2[1] != 0){
return o1[0] + o1[1] - o2[0] - o2[1];
} else {
return o2[0] - o1[0];
}
});
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++){
arr[i] = nums.get(list.get(i)[0]).get(list.get(i)[1]);
}
return arr;
}
}
总结
我承认,这次打卡的博客写的水了些,今天别的没干什么,写了篇数据结构的博客,写了一上午。。。下午到现在完成了每日十题打卡,今天是打卡的第十天,完成了进度的10%,又恰逢周末!!!不说了,以下图为证