力扣算法学习day46-2
周赛T4 - 2197-替换数组中的非互质数
题目
代码实现
class Solution {
public List<Integer> replaceNonCoprimes(int[] nums) {
// 思路:这次的T4思路还是比较简单的。
// 由于题目说了 以 任意 顺序替换相邻的非互质数都可以得到相同的结果。所以遇到相邻的非互质数
// 后,替换为它们的最小公倍数可以直接再与前后两个数进行比较,最后如果遍历到了最后一个数,且
// 它不满足条件,或者满足后替换多次,最后停下,剩余的元素就是最终结果。
// 很显然,这个过程非常贴近使用栈的遍历顺序,所以直接选用栈来遍历数组。模拟这个过程即可。
// 那么最后剩下的就是两个判断问题:
// 1.如何两个数的最小公约数
// 2.如果计算两个数的最小公倍数
// 可以写两个方法,但是这里最小公倍数其实就是最大公约数 * 两个数除以最大公约数后的数相互相乘,
// 故写一个方法(上层使用)即可,返回-1表示不符合,返回值表示两个符合,且合并的最小公倍数为这个值
// 最后按照上面的方法解决这道题即可。
// 这里一开始我用的linkedlist做栈,后来因为结果需要反转,这道题也比较好改,为了速度就换成了直接
// 使用arraylist来模拟栈的过程,然后输出的时候就不需要再复制结果和反转了。之前速度是34ms,之后29ms
List<Integer> result = new ArrayList<>();
result.add(nums[0]);
for(int i = 1;i < nums.length;i++){
int max = maxGAndMinG(result.get(result.size()-1),nums[i]);
if(max == -1){
result.add(nums[i]);
continue;
}
int temp = max;
while(temp != -1){
result.remove(result.size()-1);
max = temp;
if(result.isEmpty()){
break;
}
temp = maxGAndMinG(result.get(result.size()-1),temp);
}
result.add(max);
}
return result;
}
public int maxGAndMinG(int pre,int cur){//2 6
// 1.求最大公约数,辗转相除法
int maxG = pre;
int temp = cur;
while(temp > 0){
int mod = maxG % temp;
maxG = temp;
temp = mod;
}
// 2.判断求得的最大公约数,如果求得了最大公约数大于1,就返回最小公倍数。
if(maxG == 1){
return -1;
}
// int preV = pre / maxG;
// int curV = cur / maxG;// 去掉偶尔再减1ms,28ms
return pre / maxG * cur;
}
}