• leetcode1030之距离顺序排列矩阵单元格


    题目描述:

    难度简单31给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
    另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
    返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)
     
     
    示例:
    输入:R = 2, C = 3, r0 = 1, c0 = 2
    输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
    解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
    其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。
     
     
    几种实现方式如下:
     1 def celldistance(R, C, r0, c0):
     2     '''
     3     桶排序思想
     4     :param R:
     5     :param C:
     6     :param r0:
     7     :param c0:
     8     :return:
     9     '''
    10     dis = [[] for i in range(100)]
    11     for r in range(R):
    12         for c in range(C):
    13             # 计算距离
    14             distance = abs((r - r0)) + abs((c - c0))
    15             dis[distance].append([r, c])
    16 
    17     print("dis=", dis)
    18     result = []
    19     for i in dis:
    20         if i:
    21             result.extend(i)
    22 
    23     return result
    24 
    25 
    26 print("------------测试celldistance()------------")
    27 result = celldistance(3, 4, 0, 0)
    28 print('result=', result)
    29 
    30 dis = [[]] * 10
    31 dis1 = [[] for i in range(10)]
    32 print("dis=", dis)
    33 print("dis1=", dis1)
    34 
    35 
    36 def celldistance1(R, C, r0, c0):
    37     '''
    38     使用lambda表达式
    39     :param R:
    40     :param C:
    41     :param r0:
    42     :param c0:
    43     :return:
    44     '''
    45     # res = []
    46     # res = [[i, j] for i in range(R) for j in range(C)]
    47     # print("res=", res)
    48 
    49     res = sorted([[i, j] for i in range(R) for j in range(C)],
    50                  key=lambda item: abs(item[0] - r0) + abs(item[1] - c0))
    51     # for i in range(R):
    52     #     for j in range(C):
    53     #         res.append([i, j])
    54 
    55     # res.sort(key=lambda x: abs(x[0] - r0) + abs(x[1] - c0))
    56 
    57     return res
    58 
    59 
    60 print("-----------测试celldistance1()-----------")
    61 result = celldistance1(3, 4, 1, 1)
    62 print("result=", result)
    63 
    64 
    65 def celldistance2(R, C, r0, c0):
    66     '''
    67     使用字典,距离作为键,位置坐标作为值
    68     :param R:
    69     :param C:
    70     :param r0:
    71     :param c0:
    72     :return:
    73     '''
    74     res = {}
    75     for i in range(R):
    76         for j in range(C):
    77             distance = abs(i - r0) + abs(j - c0)
    78             if distance not in res:
    79                 res[distance] = []
    80                 res[distance].append([i, j])
    81             else:
    82                 res[distance].append([i, j])
    83     result = []
    84     for index in sorted(res.keys()):
    85         result.extend(res[index])
    86 
    87     return result
    88 
    89 
    90 print("============测试celldistance2()===========")
    91 result = celldistance2(3, 4, 0, 0)
    92 print("result=", result)

    输出:

    ------------测试celldistance()------------
    dis= [[[0, 0]], [[0, 1], [1, 0]], [[0, 2], [1, 1], [2, 0]], [[0, 3], [1, 2], [2, 1]], [[1, 3], [2, 2]], [[2, 3]], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
    result= [[0, 0], [0, 1], [1, 0], [0, 2], [1, 1], [2, 0], [0, 3], [1, 2], [2, 1], [1, 3], [2, 2], [2, 3]]
    dis= [[], [], [], [], [], [], [], [], [], []]
    dis1= [[], [], [], [], [], [], [], [], [], []]
    -----------测试celldistance1()-----------
    result= [[1, 1], [0, 1], [1, 0], [1, 2], [2, 1], [0, 0], [0, 2], [1, 3], [2, 0], [2, 2], [0, 3], [2, 3]]
    ============测试celldistance2()===========
    result= [[0, 0], [0, 1], [1, 0], [0, 2], [1, 1], [2, 0], [0, 3], [1, 2], [2, 1], [1, 3], [2, 2], [2, 3]]

    可以看到,在三种实现方式中,分别使用了桶排序思想,lambda表达式形式排序和字典存储,但归根结底,桶排序思想和字典存储具有相似之处,都是以距离为依据,将相同距离的值放入同一个容器中(桶排序中表现为存储在同一列表,字典表现为存储在同一键值下),因此只是两种不同的实现方式而已,是不是你也可以想到可以采用哈希表形式来实现(哈希表个人目前理解有点类似字典),感兴趣的可以尝试实现做一做。

    另外,不是你是否发现,桶排序实现和字典存储在追加元素时,都要对某些元素初始化(桶排序中表现为列表索引要存在,所以在一开始将列表初始化为含有100个元素的空列表,字典中表现为键值必须存在),如果初始化给你带来一点不便的话,那么方法二中采用的lambda表达式形式,显然要简便的多,列表推导式存储所有矩阵位置,然后对列表元素按曼哈顿距离进行排序即可。

     
  • 相关阅读:
    Django-01
    tkinter模块常用参数(python3)
    Python3 数据可视化之matplotlib、Pygal、requests
    python面试题(二)
    python 面试题(一)
    Python 用Redis简单实现分布式爬虫
    用python的正则表达式实现简单的计算器功能
    Python操作 RabbitMQ、Redis、Memcache
    自定义线程池
    21天学通Python课后实验题4.6
  • 原文地址:https://www.cnblogs.com/rounie/p/13036386.html
Copyright © 2020-2023  润新知