Leetcode 6122.使数组可以被整除的最少删除次数
1.问题描述
2.解决方法
解法一:排序+最大公约数
1.先辗转相除
2.然后排序
3.然后开始从最小的开始遍历,求能整除最大公约数的最小值
class Solution {
//辗转相除法求最大公约数
int gcd(int a, int b) {
if(b==0) return a;
return gcd(b, a%b);
}
public int minOperations(int[] nums, int[] numsDivide) {
//求numsDivide的最大公约数
int len = numsDivide.length;
int t = numsDivide[0];
for(int i=1;i<len;i++){
t = gcd(t, numsDivide[i]);
}
//排序然后从最小的开始遍历
Arrays.sort(nums);
//找到最小的那个可以整除最大公约数的index
int i = 0;
for(;i<nums.length;i++){
if(nums[i]>t) return -1;
//最大公约数可以整除以nums[i]
if((t % nums[i])==0) break;
}
return i==nums.length ? -1 : i;
}
}
解法二:遍历两次+最大公约数
1.遍历第一遍把最小的能整除最大公约数的数求出来
2.然后再遍历一遍把小于这个数的数字个数加起来 return回去
class Solution {
public int minOperations(int[] nums, int[] numsDivide) {
var g = 0;
for (var x : numsDivide) g = gcd(g, x);
var min = Integer.MAX_VALUE;
for (var num : nums) if (g % num == 0) min = Math.min(min, num);
if (min == Integer.MAX_VALUE) return -1;
var ans = 0;
for (var x : nums) if (x < min) ++ans;
return ans;
}
int gcd(int a, int b) {
return a == 0 ? b : gcd(b % a, a);
}
}