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

豆包 LeetCode 1998.数组的最大公因数排序 public boolean gcdSort(int[] nums)

LeetCode 1998 数组的最大公因数排序

题意

给你一个数组 nums ,可以交换最大公因数 > 1 的两个元素任意多次。
问:能否通过若干次交换,把数组变成非递减有序?

核心思路

1. 连通性建模:若两数 gcd>1,可连通;同一连通分量里的数可以任意互换位置。
2. 并查集 + 质因数关联:- 先预处理每个数的所有质因子
- 把每个数和它的质因子在并查集中合并
- 原数组排序后,逐个位置校验:原数和排序后同位置数是否在同一连通分量,有一个不在就返回 false

Java 完整代码

java
import java.util.*;

public class Solution {
static class DSU {
int[] parent;
public DSU(int n) {
parent = new int[n + 1];
for (int i = 0; i <= n; i++) parent[i] = i;
}
public int find(int x) {
if (parent[x] != x) parent[x] = find(parent[x]);
return parent[x];
}
public void union(int x, int y) {
int fx = find(x), fy = find(y);
if (fx != fy) parent[fy] = fx;
}
}

public boolean gcdSort(int[] nums) {
int maxVal = 0;
for (int num : nums) maxVal = Math.max(maxVal, num);

DSU dsu = new DSU(maxVal);
// 筛法求最小质因子
int[] minPrime = new int[maxVal + 1];
for (int i = 2; i <= maxVal; i++) {
if (minPrime[i] == 0) {
minPrime[i] = i;
for (long j = (long) i * i; j <= maxVal; j += i) {
if (minPrime[(int) j] == 0) minPrime[(int) j] = i;
}
}
}

// 每个数和它的质因子合并
for (int num : nums) {
int cur = num;
int pre = -1;
while (cur > 1) {
int p = minPrime[cur];
if (p != pre) {
dsu.union(num, p);
pre = p;
}
while (cur % p == 0) cur /= p;
}
}

// 排序数组
int[] sorted = nums.clone();
Arrays.sort(sorted);

// 逐位置校验是否同连通分量
for (int i = 0; i < nums.length; i++) {
if (dsu.find(nums[i]) != dsu.find(sorted[i])) {
return false;
}
}
return true;
}
}


思路拆解

1. 最小质因子筛:快速分解任意数的所有不同质因数。
2. 并查集合并:把数字和它的质因子合并,共享质因子的数字天然连通。
3. 校验合法性:排序后,每个位置原数和排序数必须在同一连通块,否则无法交换到位。

复杂度

- 时间:O(M\log M + N\log N),M 为数组最大值,N 为数组长度
- 空间:O(M)

需要我给你Python / C++ 版本同题代码,或精简版注释版吗?

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

相关文章:

  • 豆包 LeetCode 1998.数组的最大公因数排序 Go实现
  • 告别在线工具!用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冲击高端,能否打破空调赛道格局?