这是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),注意先除后乘防止溢出

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐