[leetcode 2197][Go][栈][模拟]替换数组中的非质数

[leetcode 2197][Go][栈][模拟]替换数组中的非质数
inkOrCloud题目链接
解题思路
拼接数组-超时
拼接数组导致每次有非质数都会将后半部分的元素遍历一遍,时间复杂度为1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21func gcd(a int, b int) int {
n, m := max(a, b), min(a, b)
if m == 0 {
return n
}
return gcd(m, n%m)
}
func replaceNonCoprimes(nums []int) []int {
for i := 0; i < len(nums); i++ {
if i > 0 {
g := gcd(max(nums[i], nums[i-1]), min(nums[i], nums[i-1]))
if g > 1 {
nums[i] = (nums[i] * nums[i-1]) / g
nums = append(nums[:i-1], nums[i:]...)
i -= 2
}
}
}
return nums
}
数组偏移量处理
既然每次拼接字符串会超时,那就对删除元素标记成负数的遍历完后再将没有标记删除的元素一次性拼接成一个数组,为了防止需要每次向前遍历上一个未删除的元素,可以在nums[i-1]删除时将其赋值为特定负数以代表上一个未被删除元素的下标与当前下标的差值
先声明一个p,若nums[i-1]未被删除则p=i-1,若nums[i-1]被删除那p=i+nums[i-1](此时nums[i-1]为上一个未被删除元素的偏移量)
nums[p]和nums[i]若为非互质数则将nums[p]暂时标记为-1(删除),nums[i]则为nums[p]和nums[i]的最小公倍数,再寻找p的上一个未被删除的元素下标并重新计算nums[i-1]的偏移量
1 | func gcd(a int, b int) int { |
此时时间复杂度为1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35func gcd(a int, b int) int {
n, m := max(a, b), min(a, b)
if m == 0 {
return n
}
return gcd(m, n%m)
}
func replaceNonCoprimes(nums []int) []int {
var stack = linkedliststack.New()
for i := range nums {
//不断弹出栈直到栈空或者上一个元素和nums[i]互质
for v, ok := stack.Pop(); ok; v, ok = stack.Pop() {
p, _ := v.(int)
g := gcd(nums[p], nums[i])
if g > 1 {
nums[i] = (nums[i] * nums[p]) / g
nums[p] = -1
} else {
//若互质(未删除)则重新压入栈
stack.Push(p)
break
}
}
//每遍历完一个元素就将其压入栈
stack.Push(i)
}
var ret = make([]int, 0)
for _, n := range nums {
if n > 0 {
ret = append(ret, n)
}
}
return ret
}

![[leetcode 3321][Go][有序集合]计算子数组的 x-sum II](https://s3.inkorcloud.top/image/2025/11/c9f55b2ecb04d16a57547b9f4de294ef.png)
![[leetcode 2589][Go][贪心]完成所有任务的最少时间](https://s3.inkorcloud.top/image/2025/11/b966fd1a91aa1ea098b86e6d778523c2.png)
![[leetcode 3234][Go]统计1显著的字符串的数量](https://s3.inkorcloud.top/image/2025/11/a72a47911de291f51cbb5902e4811c1f.png)
![[leetcode 1611][Go][位运算][记忆化搜索]使整数变为 0 的最少操作次数](https://s3.inkorcloud.top/image/2025/11/9715b5f3d8a7574ded3648767538558e.png)
![[leetcode 2528][Go][二分答案][差分数组][前缀和]最大化城市的最小电量](https://s3.inkorcloud.top/image/2025/11/fa0013722d9361b4383839722394dcf2.png)