当前位置: 首页 > news >正文

解决leetcode第3537题填充特殊网格

3537.填充特殊网格

难度:中等

问题描述:

给你一个非负整数N,表示一个2^{N}x2^{N}的网格。你需要用从0到2^{2N}-1的整数填充网格,使其成为一个特殊网格。一个网格当且仅当满足以下所有条件时,才能称之为特殊网格:

右上角象限中的所有数字都小于右下角象限中的所有数字。

右下角象限中的所有数字都小于左下角象限中的所有数字。

左下角象限中的所有数字都小于左上角象限中的所有数字。

每个象限也都是一个特殊网格。

返回一个2^{N}x2^{N}的特殊网格。

注意:任何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]]

找到规律,就已经成功了一半,再注意细节,精心设计程序,运行并反复调试,问题就会很快解决。

 

相关文章:

  • CentOS服务器中如何解决内存泄漏问题?
  • 微信小程序pinia的应用
  • 矩阵扩展-算卷积算法介绍及C语言代码实现
  • 软件架构评估方法全面解析
  • c# LINQ-Query01
  • 利用动态数字孪生:Franka Research 3 机械臂在机器人策略评估中的创新实践——基于Real-is-Sim框架的仿真与现实闭环验证
  • 5.0.4 VisualStateManager(视觉状态管理器)使用说明
  • 分区器(2)
  • kotlin一个函数返回多个值
  • 数据可视化与数据编辑器:直观呈现数据价值
  • 用 CodyBuddy 帮我写自动化运维脚本
  • Ubuntu 安装 Keepalived
  • Failed building wheel for pycuda
  • Go语言基础学习详细笔记
  • Python小酷库系列:5个常用的dict属性化访问扩展库
  • 极狐GitLab 命名空间的类型有哪些?
  • SENSE2020BSI sCMOS科学级相机主要参数及应用场景
  • SLAM:单应矩阵,本质矩阵,基本矩阵详解和对应的c++实现
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK在Linux系统下设置多个USB相机(C++)
  • python 绝对引用和相对引用
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 第四轮伊美核谈判将于11日在阿曼举行
  • 上海“随申兑”服务平台有哪些功能?已归集800余个惠企政策
  • 不主动上门检查,上海已制定14个细分领域“企业白名单”甄别规则
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)
  • 上任后首访,德国总理与法国总统举行会晤