力扣算法学习day46-2

力扣算法学习day46-2

周赛T4 - 2197-替换数组中的非互质数

题目

image-20220310172640035

image-20220310173053136

image-20220310173117298

代码实现

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人山人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值