DeepSeek LeetCode 2197.替换数组中的非互质数 TypeScript实现
/ [12,7,6] -> 6和2不互质 -> 替换为lcm(6,2)=6。// [12] -> 12和3不互质 -> 替换为lcm(12,3)=12。// [12] -> 12和2不互质 -> 替换为lcm(12,2)=12。// [12,7] -> 7和6互质 -> 压入6 -> [12,7,6]// [6] -> 6和4不互质 -> 替换为lcm(6,4)=12。// [12] -> 12和
这是LeetCode 2197题的TypeScript实现,使用栈来模拟替换过程:
```typescript
function replaceNonCoprimes(nums: number[]): number[] {
const stack: number[] = [];
for (const num of nums) {
let current = num;
// 当栈不为空且当前数与栈顶不互质时,进行替换
while (stack.length > 0 && gcd(stack[stack.length - 1], current) > 1) {
const top = stack.pop()!;
current = lcm(top, current);
}
stack.push(current);
}
return stack;
}
// 最大公约数(欧几里得算法)
function gcd(a: number, b: number): number {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
}
// 最小公倍数
function lcm(a: number, b: number): number {
return a / gcd(a, b) * b; // 先除后乘避免溢出
}
```
算法思路
1. 使用栈数据结构:维护一个栈,保证栈中任意相邻元素都是互质的
2. 处理每个数字:
· 将当前数字设为current
· 当栈不为空且栈顶与current的最大公约数大于1(即不互质)时:
· 弹出栈顶元素
· 计算栈顶和current的最小公倍数作为新的current
· 将current压入栈
3. 时间复杂度:O(n log M),其中n是数组长度,M是数字最大值
4. 空间复杂度:O(n)
示例演示
```typescript
// 示例1
console.log(replaceNonCoprimes([6,4,3,2,7,6,2]));
// 过程:
// [6] -> 6和4不互质 -> 替换为lcm(6,4)=12
// [12] -> 12和3不互质 -> 替换为lcm(12,3)=12
// [12] -> 12和2不互质 -> 替换为lcm(12,2)=12
// [12] -> 12和7互质 -> 压入7 -> [12,7]
// [12,7] -> 7和6互质 -> 压入6 -> [12,7,6]
// [12,7,6] -> 6和2不互质 -> 替换为lcm(6,2)=6
// 结果:[12,7,6]
// 示例2
console.log(replaceNonCoprimes([2,2,1,1,3,3,3]));
// 结果:[2,1,1,3]
```
关键点说明
· 互质判断:gcd(a,b) === 1 表示互质
· 替换规则:将两个非互质数替换为它们的最小公倍数
· 终止条件:当栈顶与当前数互质或栈为空时停止替换
· LCM计算:使用a * b / gcd(a,b),注意先除后乘防止溢出
更多推荐




所有评论(0)