思路:
栈模拟
若栈顶两个gcd不为1,则消去且更新,每加入一个就while循环判断一次
src:
class Solution {
public:
vector<int> replaceNonCoprimes(vector<int>& nums) {
// 使用vector栈模拟
// 优先左边配对
// 否则右边配对
vector<int> s = {nums[0]};// 初始化
// 逐一放进去
for(int i = 1; i < nums.size(); i++) {
s.push_back(nums[i]);
// 进行消除
while(s.size() > 1) {
// 看头两个能否消除
int x = s.back(), y = s[s.size() - 2];
int k = gcd(x, y);
// 若不能消除,前面也不能消除,继续加
if(k == 1) break;
// 消除并补上
s.pop_back();
// First
s.pop_back();
//s.push_back(int(x * y / k));
//cout << (x * y / k) << endl;
//一个技巧,若越界int,先转成longlong再变回int
cout << int((long long)x * y / k) << endl;
s.push_back(int((long long)x * y / k));
// Second
//s.back() *= x / k;
}
}
return s;
}
};
总结:
vector当stack用,pushback popback back获取最后一个。。。
若int越界,先变longlong再变int是一个技巧