栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 程序设计:使数组可以被整除的最少删除次数(LeetCode:2344)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 程序设计:使数组可以被整除的最少删除次数(LeetCode:2344)

给你两个正整数数组 nums 和 numsDivide 。你可以从 nums 中删除任意数目的元素。

请你返回使 nums 中 最小 元素可以整除 numsDivide 中所有元素的 最少 删除次数。如果无法得到这样的元素,返回 -1 。

如果 y % x == 0 ,那么我们说整数 x 整除 y 。

示例 1:

输入:nums = [2,3,2,4,3], numsDivide = [9,6,9,3,15]
输出:2
解释:
[2,3,2,4,3] 中最小元素是 2 ,它无法整除 numsDivide 中所有元素。
我们从 nums 中删除 2 个大小为 2 的元素,得到 nums = [3,4,3] 。
[3,4,3] 中最小元素为 3 ,它可以整除 numsDivide 中所有元素。
可以证明 2 是最少删除次数。
示例 2:

输入:nums = [4,3,6], numsDivide = [8,2,6,10]
输出:-1
解释:
我们想 nums 中的最小元素可以整除 numsDivide 中的所有元素。
没有任何办法可以达到这一目的。
 

提示:

1 <= nums.length, numsDivide.length <= 105
1 <= nums[i], numsDivide[i] <= 109

思路:如果nums中的最小元素能够整除numsDivide中的所有元素,那么一定也能整除numsDivide中所有元素的最大公约数。因此我们先求出gcd(...),然后遍历经过排序后的nums数组即可找到符合条件的最小元素。

class Solution {
public:
    int minOperations(vector& nums, vector& numsDivide) {
        int g = 0, i = 0;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        for (int val : numsDivide)
            g = gcd(g, val);
        for (; i < n; ++i)
            if (g % nums[i] == 0)
                break;
        return i == n ? -1 : i;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号