网易首页 > 网易号 > 正文 申请入驻

2024-04-10:用go语言,考虑一个非负整数数组 A, 如果数组中相

0
分享至

2024-04-10:用go语言,考虑一个非负整数数组 A,

如果数组中相邻元素之和为完全平方数,我们称这个数组是正方形数组。

现在要计算 A 的正方形排列的数量。

两个排列 A1 和 A2 被认为是不同的,如果存在至少一个索引 i,满足 A1[i] != A2[i]。

输入:[1,17,8]。

输出:2。

答案2024-04-10:

来自左程云。

灵捷3.5

大体过程如下:

1.定义变量和数据结构:

  • •定义常量为 13,表示数组的最大长度。
  • MAXN
  • •定义全局变量,存储阶乘的预计算结果。
  • f

2.编写初始化函数:

init()

  • •创建长度为的切片,并将其第一个元素初始化为 1。
  • MAXN
  • f
  • •使用循环计算并预存每个阶乘值。

3.编写函数来计算正方形排列的数量:

numSquarefulPerms(nums []int) int

  • •初始化变量为数组的长度。
  • n
  • nums
  • •创建二维切片和,分别用于记录数字之间是否存在完全平方数关系和动态规划的状态。
  • graph
  • dp
  • •遍历数组构建图,找出数字之间的完全平方数关系。
  • nums
  • graph
  • •初始化变量为 0,用于记录正方形排列的数量。
  • ans
  • •使用深度优先搜索函数遍历图,并计算正方形排列的数量。
  • dfs()
  • graph
  • •将数组进行排序,以便处理相同数字的情况。
  • nums
  • •使用变量和遍历排序后的数组,计算相同数字之间的排列数量,并更新结果。
  • start
  • end
  • nums
  • •返回最终的正方形排列数量。

4.编写深度优先搜索函数:

dfs(graph [][]int, i int, s int, n int, dp [][]int) int

  • •如果当前状态表示所有元素都被使用,返回1,表示找到了一种满足条件的排列。
  • s
  • •如果当前状态已经被计算过,直接返回对应的结果。
  • •初始化变量为 0,用于记录满足条件的排列数量。
  • ans
  • •遍历与当前位置相邻的下一个位置:
  • i
  • next
    • •如果下一个位置还未被包含在当前状态中,将其加入到状态中,并递归调用继续搜索。
  • next
  • s
  • s
  • dfs()
    • •将递归调用的结果累加到变量中。
  • ans
  • •将结果存储到中,并返回。
  • dp

5.在函数中调用,传入示例数据,并打印结果。

main()

numSquarefulPerms()

[1, 17, 8]

总的时间复杂度:O(n * n!)

  • •预计算阶乘的时间复杂度为 O(MAXN) = O(1),因为 MAXN 是常数。
  • •构建图和计算正方形排列的数量的时间复杂度为 O(n!),其中 n 是数组的长度。
  • nums
  • •数组排序的时间复杂度为 O(n * logn),其中 n 是数组的长度。
  • nums

总的空间复杂度:O(n * 2^n)

  • •动态规划的状态数组的空间复杂度为 O(n * 2^n),其中 n 是数组的长度。
  • dp
  • nums
  • •构建图的辅助数组的空间复杂度为 O(n^2),其中 n 是数组的长度。
  • graph
  • nums
  • •其他变量和数据结构的空间复杂度为 O(1)。

Go完整代码如下:

packagemain
import(
"fmt"
"math"
"sort"
)
varMAXNint=13
varf[]int
funcinit(){
f=make([]int,MAXN)
f[0]=1
fori:=1;if[i]=i*f[i-1]
}
}
funcnumSquarefulPerms(nums[]int)int{
n:=len(nums)
graph:=make([][]int,n)
dp:=make([][]int,n)
fori:=0;igraph[i]=make([]int,0)
dp[i]=make([]int,1<forj:=0;j<1<dp[i][j]=-1
}
}
fori:=0;iforj:=i+1;js:=int(math.Sqrt(float64(nums[i]+nums[j])))
ifs*s==nums[i]+nums[j]{
graph[i]=append(graph[i],j)
graph[j]=append(graph[j],i)
}
}
}
ans:=0
fori:=0;ians+=dfs(graph,i,1<}
sort.Ints(nums)
start:=0
forend:=1;endifnums[start]!=nums[end]{
ans/=f[end-start]
start=end
}
}
ans/=f[n-start]
returnans
}
funcdfs(graph[][]int,iint,sint,nint,dp[][]int)int{
ifs==(1<return1
}
ifdp[i][s]!=-1{
returndp[i][s]
}
ans:=0
for_,next:=rangegraph[i]{
ifs&(1<ans+=dfs(graph,next,s|(1<}
}
dp[i][s]=ans
returnans
}
funcmain(){
nums:=[]int{1,17,8}
result:=numSquarefulPerms(nums)
fmt.Println(result)
}



Python完整代码如下:

#-*-coding:utf-8-*-
importmath
fromcollectionsimportdefaultdict
MAXN=13
f=[0]*MAXN
definit():
globalf
f[0]=1
foriinrange(1,MAXN):
f[i]=i*f[i-1]
defnumSquarefulPerms(nums):
n=len(nums)
graph=defaultdict(list)
dp=[[-1for_inrange(1<
foriinrange(n):
forjinrange(i+1,n):
s=int((nums[i]+nums[j])**0.5)
ifs*s==nums[i]+nums[j]:
graph[i].append(j)
graph[j].append(i)
defdfs(i,s):
ifs==(1<return1
ifdp[i][s]!=-1:
returndp[i][s]
ans=0
fornextingraph[i]:
ifs&(1<ans+=dfs(next,s|(1<dp[i][s]=ans
returnans
ans=0
foriinrange(n):
ans+=dfs(i,1<
nums.sort()
start=0
forendinrange(1,n):
ifnums[start]!=nums[end]:
ans//=f[end-start]
start=end
ans//=f[n-start]
returnans
init()
nums=[1,17,8]
result=numSquarefulPerms(nums)
print(result)



声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
27岁樊振东状态不佳,疑似被29岁央视主播绯闻女友“榨干”?

27岁樊振东状态不佳,疑似被29岁央视主播绯闻女友“榨干”?

陈爷book说
2024-05-29 15:02:22
媒体人:若国足在中泰战输球,中国男足球员薪水可能还会继续下降

媒体人:若国足在中泰战输球,中国男足球员薪水可能还会继续下降

直播吧
2024-05-29 11:50:08
疑“不良言论”香港女艺人新剧内地开播,被扒曾诅咒港警感染新冠

疑“不良言论”香港女艺人新剧内地开播,被扒曾诅咒港警感染新冠

不掉线电波
2024-05-29 16:05:27
以色列议会拟推动认定联合国机构为恐怖组织!

以色列议会拟推动认定联合国机构为恐怖组织!

鲁中晨报
2024-05-29 09:30:09
是时候重估复星了

是时候重估复星了

华商韬略
2024-05-29 10:25:25
奥迪新车刚开七个月路边自燃烧毁,4S店:只能按三包赔付

奥迪新车刚开七个月路边自燃烧毁,4S店:只能按三包赔付

澎湃新闻
2024-05-29 07:14:45
乱打比方的环保局长,顺手带走了“县委主要负责同志”

乱打比方的环保局长,顺手带走了“县委主要负责同志”

民言民语
2024-05-29 15:25:15
中美最大对赌终于来了!外媒称中国巨头要求2027年芯片去美化,大V坚信:我们一定胜出

中美最大对赌终于来了!外媒称中国巨头要求2027年芯片去美化,大V坚信:我们一定胜出

老郭在学习
2024-05-29 10:59:42
一篇“赖清德动嘴,我们军演花大钱”的文章,头条给了640万展现

一篇“赖清德动嘴,我们军演花大钱”的文章,头条给了640万展现

消失的电波
2024-05-26 21:13:48
李若彤激动发文!从香港九龙西站乘高铁到长沙,仅用了三个半小时

李若彤激动发文!从香港九龙西站乘高铁到长沙,仅用了三个半小时

元气少女侃娱乐
2024-05-29 10:21:13
实锤了!985重点大学集体打明牌!数学单科145分以上即可破格入围

实锤了!985重点大学集体打明牌!数学单科145分以上即可破格入围

手工制作阿爱
2024-05-28 21:18:36
钱到账了,娃哈哈一线员工实发工资曝光

钱到账了,娃哈哈一线员工实发工资曝光

爱看剧的阿峰
2024-05-29 02:09:50
外交部人事变动:3人被提拔,两人被任命副部长,最年轻的仅54岁

外交部人事变动:3人被提拔,两人被任命副部长,最年轻的仅54岁

李昕言温度空间
2024-05-29 14:07:00
郭有才凉了!

郭有才凉了!

新动察
2024-05-29 09:48:19
受贿超11亿 华融国际原总经理白天辉获死刑判决

受贿超11亿 华融国际原总经理白天辉获死刑判决

半两财经
2024-05-28 20:58:16
上海一老板跑路,900人失业,公司创立仅1年多,已经亏损62亿!

上海一老板跑路,900人失业,公司创立仅1年多,已经亏损62亿!

古希腊掌管松饼的神
2024-05-28 22:56:03
莫名其妙!印媒:15名解放军士兵头部受印军重击生还希望渺茫

莫名其妙!印媒:15名解放军士兵头部受印军重击生还希望渺茫

小弟萝卜呀1
2024-05-28 21:43:35
全世界都愤怒了,但美国却说:未过红线

全世界都愤怒了,但美国却说:未过红线

观察者网
2024-05-29 08:32:07
曝某幼儿园里的一幕:小朋友认真听老师讲解,屏幕上显示"间谍可能就在你我身边"

曝某幼儿园里的一幕:小朋友认真听老师讲解,屏幕上显示"间谍可能就在你我身边"

互联网大聪明
2024-05-29 13:58:28
将近40岁满脸褶,却尬演18岁少女,是谁给了她“强行装嫩”的勇气

将近40岁满脸褶,却尬演18岁少女,是谁给了她“强行装嫩”的勇气

娱乐圈十三太保
2024-05-28 13:56:53
2024-05-29 17:26:44
moonfdd
moonfdd
福大大架构师每日一题
405文章数 7关注度
往期回顾 全部

科技要闻

王传福再放狠话,燃油车要成“非主流”

头条要闻

西北大学博士招生被质疑"空降"本校考生 学院:正调查

头条要闻

西北大学博士招生被质疑"空降"本校考生 学院:正调查

体育要闻

巴黎主席向皇马索要8000万 佛爷:1分不给

娱乐要闻

张若昀怎么剧外比剧内更惨兮兮…

财经要闻

东方通收购藏雷 花6亿买来"业绩变脸"

汽车要闻

新哈弗H6苦练内功 向燃油车绝缘智能SAY NO

态度原创

时尚
艺术
家居
公开课
军事航空

夏天穿搭适合多点色彩!建议试试蓝色、浅黄、紫色,亮眼时髦

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

家居要闻

与美共生 空间线条勾勒生活风雅

公开课

近视只是视力差?小心并发症

军事要闻

美国一架F-35坠毁 飞行员弹射逃生被送医

无障碍浏览 进入关怀版