Leetcode 1424. Diagonal Traverse II (python)

题目

在这里插入图片描述

解法1:排序

这道题关键在于在同一条对角线上的元素行数和列数的和是相同的。所以将每个元素按照(r+c,r,val)储存,然后先按照第一个元素升序排序,其次按照第二个元素降序排序即可

这边有个要注意的点是这两个排序是一个升序一个排序,而且要在第一个排序的基础上进行排序,在python里面需要用sorted函数,并且secondary element,再排primary element,详细参见:https://docs.python.org/3/howto/sorting.html
在这里插入图片描述

class Solution:
    def findDiagonalOrder(self, nums: List[List[int]]) -> List[int]:
        arr = []
        for r in range(len(nums)):
            for c in range(len(nums[r])):
                arr.append((r+c,r,nums[r][c]))
        
        s = sorted(arr,key=lambda x:x[1],reverse=True)
        s = sorted(s,key=lambda x:x[0])
        
        ans = []
        for _,_,val in s:
            ans.append(val)
        
        return ans

解法2:

其实这道题目有个没有说清楚的地方,就是元素是不是按照行和列严格升序排列的,通过test case来看实际上是符合这个条件的。在这个基础上,都不需要进行任何排序,具体如下

class Solution:
    def findDiagonalOrder(self, nums: List[List[int]]) -> List[int]:
        dic = collections.defaultdict(list)
        for r in range(len(nums)):
            for c in range(len(nums[r])):
                dic[r+c].append(nums[r][c])
        
        ans = []
        for k,v in dic.items():
            for num in reversed(v):
                ans.append(num)
        
        return ans
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页