2344. 使数组可以被整除的最少删除次数-快速排序加贪心算法

  1. 使数组可以被整除的最少删除次数-快速排序加遍历

给你两个正整数数组 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 中的所有元素。
没有任何办法可以达到这一目的。
这一题我们对nums排序后,找到第一个最小的公约数就可以了,解题代码如下:

void quick(int *a,int low,int high){
    if(low<high){
        int l=low,h=high,p=a[low];
        while(low<high){
            while(low<high&&a[high]>=p){
                high--;
            }
            a[low]=a[high];
           
            while(low<high&&a[low]<=p){
                low++;
            }
            a[high]=a[low];
           
        }
        a[low]=p;
       
        quick(a,l,low-1);
        quick(a,low+1,h);
    }
}
int cmp(const void* a, const void* b)
 {
     return *(int*)a - *(int*)b;
 }
bool judge(int val,int *numsDivide,int numsDivideSize){
    for(int i=0;i<numsDivideSize;i++){
        if(numsDivide[i]%val!=0){
            return false;
        }
    }
    return true;

}

int minOperations(int* nums, int numsSize, int* numsDivide, int numsDivideSize){

  
         qsort(nums, numsSize, sizeof(int), cmp);
             
     
    for(int i=0;i<numsSize;){
       int index=i;
       for(;i<numsSize;){
           if(nums[i]==nums[index]){
               i++;
           }
           else{
               break;

           }

       }
     
      if(judge(nums[i-1],numsDivide,numsDivideSize)){
          return index;
      }

    
      
    }
    return -1;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值