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

Qwen模型 LeetCode 2584. 分割数组使乘积互质 Java实现

哇!这道2584题超有意思的,让我来给你讲讲我的解法思路~ 这道题就像是在玩"化学实验",我们要把数组分成两部分,让它们的"化学成分"(质因数)完全不重叠!

题目要求找到最小的分割点,使得左边所有数的乘积和右边所有数的乘积互质。互质就是说它们没有共同的质因数,就像两个陌生人一样没有任何交集。

```java
import java.util.*;

public class Solution {
public int findValidSplit(int[] nums) {
int n = nums.length;

// 特判:只有一个元素的情况
if (n == 1) return -1;

// 记录每个质因数最后出现的位置
Map<Integer, Integer> lastOccurrence = new HashMap<>();

// 预处理:找出每个位置的所有质因数,并记录它们最后出现的位置
for (int i = 0; i < n; i++) {
int num = nums[i];
Set<Integer> primeFactors = getPrimeFactors(num);
for (int factor : primeFactors) {
lastOccurrence.put(factor, i);
}
}

// 贪心扫描:维护当前需要覆盖的最远位置
int maxReach = 0;

for (int i = 0; i < n - 1; i++) {
int num = nums[i];
Set<Integer> primeFactors = getPrimeFactors(num);

// 更新当前需要覆盖的最远位置
for (int factor : primeFactors) {
maxReach = Math.max(maxReach, lastOccurrence.get(factor));
}

// 如果当前位置已经可以作为分割点
if (i >= maxReach) {
return i;
}
}

return -1;
}

// 获取一个数的所有质因数(去重)
private Set<Integer> getPrimeFactors(int num) {
Set<Integer> factors = new HashSet<>();

// 处理因子2
if (num % 2 == 0) {
factors.add(2);
while (num % 2 == 0) {
num /= 2;
}
}

// 处理奇数因子
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
factors.add(i);
while (num % i == 0) {
num /= i;
}
}
}

// 如果剩下的数大于1,说明它本身就是一个质数
if (num > 1) {
factors.add(num);
}

return factors;
}
}
```

嘿嘿,这个解法的核心思想特别巧妙!我把它叫做"质因数覆盖区间"法:

**想象一下**:每个质因数就像一条彩带,从它第一次出现的位置一直延伸到最后一次出现的位置。我们要找的分割点,就是所有彩带都结束之后的位置!

**算法步骤**:
1. **预处理阶段**:遍历整个数组,找出每个质因数最后出现的位置
2. **贪心扫描**:从左到右走,维护一个"最远需要覆盖的位置"
3. **判断分割点**:当我们的当前位置超过了所有已遇到质因数的最远位置时,就可以分割啦!

举个例子:`[2, 3, 6, 5]`
- 质因数2出现在位置0和2,最后在位置2
- 质因数3出现在位置1和2,最后在位置2
- 质因数5出现在位置3,最后在位置3

当我们走到位置2时,发现质因数2和3的最远位置都是2,但这时候我们还没处理完,因为位置2的6还包含了这些因子。只有当我们确保所有相关的质因数都不会再出现在右边时,才能安全分割!

这个算法的时间复杂度大概是 O(n√m),其中m是数组中最大的数,空间复杂度是O(k),k是不同质因数的个数。

你觉得这个思路怎么样?要不要我再给你讲讲其他类似的"区间覆盖"问题?这类题目在面试中还挺常见的呢!😄

http://www.jsqmd.com/news/874771/

相关文章:

  • 别再死记硬背了!用Python+OpenCV手把手教你理解Anchor机制(附代码可视化)
  • Unity弓箭抛物线弹道实现:手动物理积分与实时预览
  • 差分隐私矩阵机制与FFT优化:保护多轮迭代计算的高效方法
  • C#根据时间加密和防止反编译的两种方案
  • 基于K-means与修正优化的数据压缩表示:为机器学习模型高效瘦身
  • 超效率SBM模型Python实战:用scipy.optimize处理含非期望产出的政府数据效率排名
  • 移动端3D高斯泼溅渲染优化:Lumina系统架构解析
  • 前端国际化进阶:日期时间格式化完全指南
  • 告别第三方工具!Windows 11自带SSH服务保姆级开启与开机自启教程
  • Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 C语言实现
  • CSS Web安全字体
  • Godot 4地形性能修复:图层混合、LOD切换与法线生成三大断点解决方案
  • 前端国际化:复数规则与文案匹配深度解析
  • 别再死记硬背Sobel算子公式了!用Python+OpenCV手把手带你拆解卷积核的底层逻辑
  • 国内304不锈钢橱柜加工厂专业能力排行盘点:不锈钢钣金加工厂/专业不锈钢橱柜厂家/全屋定制不锈钢橱柜/定做不锈钢橱柜厂家/选择指南 - 优质品牌商家
  • Calico BGP故障诊断:从BIRD未就绪到Established的全链路排查
  • 前端国际化框架对比:i18next vs react-i18next vs Lingui vs Format.js
  • CVE-2024-38819漏洞复现:Tomcat 10.1.22 JNDI注入完整验证指南
  • 嵌入式开发中的字节序解析与C51实现方案
  • 从LightGBM到逻辑回归:手把手教你用category_encoders库搞定5种特征编码
  • AI同质化与认知依赖:金融系统性风险的新挑战与监管应对
  • 十年未更新的开源激光计算器LaserCalc,在2024年还能怎么用?我的实战踩坑与配置指南
  • Windows计划任务schtasks命令的‘隐藏’玩法与避坑指南:从权限设置到中文路径处理
  • 量子Jacobi-Davidson方法:电子结构计算的高效算法
  • 前端国际化:数字与货币格式化实战指南
  • 别再手动改路由了!用NetworkManager在麒麟KOS里永久固定双网卡优先级
  • 量子计算在蛋白质折叠问题中的应用与BF-DCQO算法解析
  • 保姆级教程:用ESM-2模型为你的蛋白质序列生成向量表示(Python实战)
  • 2026成都自动化测试公司推荐榜:成都自动化测试、成都车载测试、成都软件测试、成都金融测试、成都鸿蒙测试、成都IT培训公司选择指南 - 优质品牌商家
  • 8051开发中PDATA内存优化使用指南