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

豆包 LeetCode 1998.数组的最大公因数排序 Go实现

LeetCode 1998 数组的最大公因数排序 Go 实现

思路

并查集 + 最小质因子筛:

1. 先找出数组最大值,预处理最小质因子
2. 把每个数与其所有质因子并入同一集合
3. 数组排序后,逐个位置检查:原数和排序后同位置数是否在同一连通集,不在则返回 false

Go 完整代码

go
package main

import (
"sort"
)

// 并查集
type DSU struct {
parent []int
}

func NewDSU(n int) *DSU {
parent := make([]int, n+1)
for i := range parent {
parent[i] = i
}
return &DSU{parent: parent}
}

func (d *DSU) Find(x int) int {
if d.parent[x] != x {
d.parent[x] = d.Find(d.parent[x])
}
return d.parent[x]
}

func (d *DSU) Union(x, y int) {
fx := d.Find(x)
fy := d.Find(y)
if fx != fy {
d.parent[fy] = fx
}
}

func gcdSort(nums []int) bool {
maxVal := 0
for _, v := range nums {
if v > maxVal {
maxVal = v
}
}

// 最小质因子筛
minPrime := make([]int, maxVal+1)
for i := 2; i <= maxVal; i++ {
if minPrime[i] == 0 {
minPrime[i] = i
for j := i * i; j <= maxVal; j += i {
if minPrime[j] == 0 {
minPrime[j] = i
}
}
}
}

dsu := NewDSU(maxVal)
// 每个数和质因子合并
for _, num := range nums {
cur := num
pre := -1
for cur > 1 {
p := minPrime[cur]
if p != pre {
dsu.Union(num, p)
pre = p
}
for cur%p == 0 {
cur /= p
}
}
}

// 拷贝并排序
sorted := make([]int, len(nums))
copy(sorted, nums)
sort.Ints(sorted)

// 逐位置校验
for i := range nums {
if dsu.Find(nums[i]) != dsu.Find(sorted[i]) {
return false
}
}
return true
}


核心逻辑说明

1. 并查集:维护数字、质因子的连通关系,有公共质因子就可互相交换
2. 最小质因子线性筛:快速分解每个数的不同质因数
3. 校验规则:能交换的数必须在同一个连通块,排序后同位置元素必须同源

直接可提交 LeetCode,无需修改。需要我给你加详细注释版吗?

http://www.cnnetsun.cn/news/2188515.html

相关文章:

  • 告别在线工具!用Python的simplekml库5分钟搞定CSV转KML(附完整代码)
  • 别光看源码了!手把手教你用Python的tkinter做个带记忆功能的计算器
  • CentOS 7.9服务器磁盘挂载踩坑实录:从‘wrong fs type’到LVM卷组移除的完整排错指南
  • 量化交易策略开发实战:从回测到部署的完整框架指南
  • 如何快速掌握网络资源嗅探:3步实现跨平台下载神器
  • KMS_VL_ALL_AIO:三步轻松搞定Windows和Office激活难题
  • 23《CAN总线硬件布线规范与抗干扰要点深度解析》
  • BXIv3:欧洲高性能计算互联技术解析与创新
  • Competitive Companion终极指南:编程竞赛效率提升的完整解决方案
  • 高性能PDF处理库pdf_oxide:Rust内核驱动,多语言绑定,0.8ms极速解析
  • 终极指南:如何用AKShare快速获取免费金融数据
  • AI驱动社交媒体内容管理:基于CLIP与GPT的Instagram自动化组织方案
  • Solana链上AI智能体SATAN6x6:架构解析与实战部署指南
  • 多模态大语言模型工具调用与优化实战指南
  • OpenClaw命令指南:从安装到实战,提升数据抓取与自动化效率
  • 告别MATLAB?手把手教你用QT+Python打造轻量级频谱分析与跳频信号侦察系统
  • 实测Taotoken平台调用百度大模型的响应延迟与稳定性表现
  • VMware Workstation Pro 17免费许可证密钥:简单三步激活终极指南
  • 从“灌水”到“顶刊”:如何根据你的孟德尔随机化研究水平,精准匹配期刊(2024版选刊攻略)
  • 从SENet到GhostNetV2:注意力机制在移动端模型中的实战优化与选型指南
  • 微信聊天记录被锁在加密数据库中?3步教你用WechatDecrypt轻松解密
  • 多模态模型UniCorn框架:自博弈系统与生成质量优化
  • 创业团队如何利用统一API管理多个大模型以应对不同业务场景
  • FreeACT:基于FreeRTOS的Actor模型框架,重塑嵌入式并发编程
  • 3分钟学会用SharpKeys:Windows键盘重映射的终极免费神器
  • BLHeli_S与BLHeli_32固件刷写指南:如何用同一个Arduino下载器搞定?
  • 从科研顶刊到业务报表:手把手教你用Python密度散点图做模型效果分析与异常检测
  • 别再让电源噪声搞砸你的DSP时钟!手把手教你为TI/ADI DSP的PLL设计Pi/T型滤波电路
  • TCL空调借AI冲击高端,能否打破空调赛道格局?
  • 别再写 `int rand = 0;` 了!C++命名空间实战避坑指南(从冲突到优雅解决)