列表

详情


2197. 替换数组中的非互质数

给你一个整数数组 nums 。请你对数组执行下述操作:

  1. nums 中找出 任意 两个 相邻非互质 数。
  2. 如果不存在这样的数,终止 这一过程。
  3. 否则,删除这两个数,并 替换 为它们的 最小公倍数(Least Common Multiple,LCM)。
  4. 只要还能找出两个相邻的非互质数就继续 重复 这一过程。

返回修改后得到的 最终 数组。可以证明的是,以 任意 顺序替换相邻的非互质数都可以得到相同的结果。

生成的测试用例可以保证最终数组中的值 小于或者等于 108

两个数字 xy 满足 非互质数 的条件是:GCD(x, y) > 1 ,其中 GCD(x, y)xy最大公约数

 

示例 1 :

输入:nums = [6,4,3,2,7,6,2]
输出:[12,7,6]
解释:
- (6, 4) 是一组非互质数,且 LCM(6, 4) = 12 。得到 nums = [12,3,2,7,6,2] 。
- (12, 3) 是一组非互质数,且 LCM(12, 3) = 12 。得到 nums = [12,2,7,6,2] 。
- (12, 2) 是一组非互质数,且 LCM(12, 2) = 12 。得到 nums = [12,7,6,2] 。
- (6, 2) 是一组非互质数,且 LCM(6, 2) = 6 。得到 nums = [12,7,6] 。
现在,nums 中不存在相邻的非互质数。
因此,修改后得到的最终数组是 [12,7,6] 。
注意,存在其他方法可以获得相同的最终数组。

示例 2 :

输入:nums = [2,2,1,1,3,3,3]
输出:[2,1,1,3]
解释:
- (3, 3) 是一组非互质数,且 LCM(3, 3) = 3 。得到 nums = [2,2,1,1,3,3] 。
- (3, 3) 是一组非互质数,且 LCM(3, 3) = 3 。得到 nums = [2,2,1,1,3] 。
- (2, 2) 是一组非互质数,且 LCM(2, 2) = 2 。得到 nums = [2,1,1,3] 。
现在,nums 中不存在相邻的非互质数。 
因此,修改后得到的最终数组是 [2,1,1,3] 。 
注意,存在其他方法可以获得相同的最终数组。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> replaceNonCoprimes(vector<int>& nums) { } };

rust 解法, 执行用时: 36 ms, 内存消耗: 3.5 MB, 提交时间: 2023-09-14 00:37:42

impl Solution {
    pub fn replace_non_coprimes(nums: Vec<i32>) -> Vec<i32> {
        fn gcd(a: i32, b: i32)->i32{
            if b == 0{
                return a;
            }else{
                return gcd(b, a%b);
            }
        }
        let mut ans = vec![nums[0]];
        for &num in nums.iter().skip(1){
            ans.push(num);
            loop{
                if ans.len() <= 1 {
                    break;
                }
                let mut x = ans[ans.len() -1];
                let mut y = ans[ans.len() -2];
                let g = gcd(x, y);
                if g == 1{
                    break;
                }
                ans.pop();
                let top = ans.last_mut().unwrap();
                *top = *top /g * x;
            }
        }
        ans
    }
}

golang 解法, 执行用时: 156 ms, 内存消耗: 8.9 MB, 提交时间: 2023-09-14 00:37:18

func replaceNonCoprimes(nums []int) []int {
	s := []int{}
	for _, num := range nums {
		s = append(s, num)
		for len(s) > 1 {
			x, y := s[len(s)-1], s[len(s)-2]
			g := gcd(x, y)
			if g == 1 {
				break
			}
			s = s[:len(s)-1]
			s[len(s)-1] *= x / g
		}
	}
	return s
}

func gcd(a, b int) int { for a != 0 { a, b = b%a, a }; return b }

cpp 解法, 执行用时: 148 ms, 内存消耗: 118.4 MB, 提交时间: 2023-09-14 00:37:06

class Solution {
public:
    vector<int> replaceNonCoprimes(vector<int> &nums) {
        vector<int> s;
        for (int num : nums) {
            s.push_back(num);
            while (s.size() > 1) {
                int x = s.back(), y = s[s.size() - 2];
                int g = gcd(x, y);
                if (g == 1) break;
                s.pop_back();
                s.back() *= x / g;
            }
        }
        return s;
    }
};

java 解法, 执行用时: 36 ms, 内存消耗: 61.8 MB, 提交时间: 2023-09-14 00:36:54

class Solution {
    public List<Integer> replaceNonCoprimes(int[] nums) {
        var s = new ArrayList<Integer>();
        for (var num : nums) {
            s.add(num);
            while (s.size() > 1) {
                var x = s.get(s.size() - 1);
                var y = s.get(s.size() - 2);
                var g = gcd(x, y);
                if (g == 1) break;
                s.remove(s.size() - 1);
                s.set(s.size() - 1, x / g * y);
            }
        }
        return s;
    }

    int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
}

python3 解法, 执行用时: 292 ms, 内存消耗: 29.9 MB, 提交时间: 2023-09-14 00:36:40

class Solution:
    def replaceNonCoprimes(self, nums: List[int]) -> List[int]:
        s = []
        for num in nums:
            s.append(num)
            while len(s) > 1:
                x, y = s[-1], s[-2]
                g = gcd(x, y)
                if g == 1: break
                s.pop()
                s[-1] *= x // g
        return s

上一题