解决leetcode第3537题填充特殊网格
3537.填充特殊网格
难度:中等
问题描述:
给你一个非负整数N,表示一个x
的网格。你需要用从0到
-1的整数填充网格,使其成为一个特殊网格。一个网格当且仅当满足以下所有条件时,才能称之为特殊网格:
右上角象限中的所有数字都小于右下角象限中的所有数字。
右下角象限中的所有数字都小于左下角象限中的所有数字。
左下角象限中的所有数字都小于左上角象限中的所有数字。
每个象限也都是一个特殊网格。
返回一个x
的特殊网格。
注意:任何1x1的网格都是特殊网格。
示例1:
输入:N=0
输出:[[0]]
解释:
唯一可以放置的数字是0,并且网格中只有一个位置。
示例2:
输入:N=1
输出:[[3,0],[2,1]]
解释:
每个象限的数字如下:
右上角:0
右下角:1
左下角:2
左上角:3
由于0<1<2<3,该网格满足给定的约束条件。
示例3:
输入:N=2
输出:[[15,12,3,0],[14,13,2,1],[11,8,7,4],[10,9,6,5]]
解释:
每个象限的数字如下:
右上角:3,0,2,1
右下角:7,4,6,5
左下角:11,8,10,9
左上角:15,12,14,13
max(3,0,2,1)<min(7,4,6,5)
max(7,4,6,5)<min(11,8,10,9)
max(11,8,10,9)<min(15,12,14,13)
这满足前三个要求。此外,每个象限也是一个特殊网格。因此,这是一个特殊网格。
提示:
0<=N<=10
问题分析:
这个问题还是很有趣的,有点找规律的意思,特别是把它变成网格之后,这个规律就很容易观察到了,而且我们解决问题也要利用这个规律。
N=0时,输出[[0]]
N=1时,输出[[3,0],[2,1]]
N=2时,输出[[15,12,3,0],[14,13,2,1],[11,8,7,4],[10,9,6,5]]
可以看出,四个象限,按右上->右下->左下->左上的顺序,对应位置的值增加了4
N=3时,输出[[63, 60, 51, 48, 15, 12, 3, 0], [62, 61, 50, 49, 14, 13, 2, 1], [59, 56, 55, 52, 11, 8, 7, 4], [58, 57, 54, 53, 10, 9, 6, 5], [47, 44, 35, 32, 31, 28, 19, 16], [46, 45, 34, 33, 30, 29, 18, 17], [43, 40, 39, 36, 27, 24, 23, 20], [42, 41, 38, 37, 26, 25, 22, 21]]
四个象限,按右上->右下->左下->左上的顺序,对应位置的值增加了16
......
这是一种自相似数据,有点分形的意思。
正是因为是一种自相似的数据,所以采用递归方法来实现这个问题的求解。
与n-1对应的特殊网格,其实只是与n对应网格的右上象限部分,根据对应位置增加的值,就可以把右下、左下、左上的网格求出,然后再组合出与n对应的网格。
程序如下:
#函数根据参数n的值,返回满足条件的特殊网格
def get_n_array(n):if n==0:return [[0]]elif n==1:return [[3,0],[2,1]]else:right_up=get_n_array(n-1)k=2**(2*n-2)right_down=[]for i in right_up:a=[b+k for b in i]right_down.append(a)left_down=[]for i in right_up:a=[b+2*k for b in i]left_down.append(a)left_up=[]for i in right_up:a=[b+3*k for b in i]left_up.append(a)my_array=[]for i in range(2**(n-1)):my_array.append(left_up[i]+right_up[i])for i in range(2**(n-1)):my_array.append((left_down[i]+right_down[i]))return my_array
n=int(input('pls input n='))
a=get_n_array(n)
运行实例一
pls input n=0
[[0]]
运行实例二
pls input n=1
[[3, 0], [2, 1]]
运行实例三
pls input n=2
[[15, 12, 3, 0], [14, 13, 2, 1], [11, 8, 7, 4], [10, 9, 6, 5]]
运行实例四
pls input n=3
[[63, 60, 51, 48, 15, 12, 3, 0], [62, 61, 50, 49, 14, 13, 2, 1], [59, 56, 55, 52, 11, 8, 7, 4], [58, 57, 54, 53, 10, 9, 6, 5], [47, 44, 35, 32, 31, 28, 19, 16], [46, 45, 34, 33, 30, 29, 18, 17], [43, 40, 39, 36, 27, 24, 23, 20], [42, 41, 38, 37, 26, 25, 22, 21]]
运行实例五
pls input n=4
[[255, 252, 243, 240, 207, 204, 195, 192, 63, 60, 51, 48, 15, 12, 3, 0], [254, 253, 242, 241, 206, 205, 194, 193, 62, 61, 50, 49, 14, 13, 2, 1], [251, 248, 247, 244, 203, 200, 199, 196, 59, 56, 55, 52, 11, 8, 7, 4], [250, 249, 246, 245, 202, 201, 198, 197, 58, 57, 54, 53, 10, 9, 6, 5], [239, 236, 227, 224, 223, 220, 211, 208, 47, 44, 35, 32, 31, 28, 19, 16], [238, 237, 226, 225, 222, 221, 210, 209, 46, 45, 34, 33, 30, 29, 18, 17], [235, 232, 231, 228, 219, 216, 215, 212, 43, 40, 39, 36, 27, 24, 23, 20], [234, 233, 230, 229, 218, 217, 214, 213, 42, 41, 38, 37, 26, 25, 22, 21], [191, 188, 179, 176, 143, 140, 131, 128, 127, 124, 115, 112, 79, 76, 67, 64], [190, 189, 178, 177, 142, 141, 130, 129, 126, 125, 114, 113, 78, 77, 66, 65], [187, 184, 183, 180, 139, 136, 135, 132, 123, 120, 119, 116, 75, 72, 71, 68], [186, 185, 182, 181, 138, 137, 134, 133, 122, 121, 118, 117, 74, 73, 70, 69], [175, 172, 163, 160, 159, 156, 147, 144, 111, 108, 99, 96, 95, 92, 83, 80], [174, 173, 162, 161, 158, 157, 146, 145, 110, 109, 98, 97, 94, 93, 82, 81], [171, 168, 167, 164, 155, 152, 151, 148, 107, 104, 103, 100, 91, 88, 87, 84], [170, 169, 166, 165, 154, 153, 150, 149, 106, 105, 102, 101, 90, 89, 86, 85]]
找到规律,就已经成功了一半,再注意细节,精心设计程序,运行并反复调试,问题就会很快解决。