6214. 判断两个事件是否存在冲突
class Solution {
public boolean haveConflict(String[] event1, String[] event2) {
return event1[0].compareTo(event2[0]) <= 0 && event2[0].compareTo(event1[1]) <= 0 ||
event2[0].compareTo(event1[0]) <= 0 && event1[0].compareTo(event2[1]) <= 0;
}
}
6224. 最大公因数等于 K 的子数组数目
暴力解法:
双循环遍历所有的数组,然后计算每个子数组的最大公约数是不是k
import java.math.BigInteger;
class Solution {
public int subarrayGCD(int[] nums, int k) {
int ans = 0, n = nums.length;
for (int i = 0;i < n; i++) {
if (nums[i] % k != 0) {
continue;
}
boolean flag = false;
BigInteger g = BigInteger.ZERO;
for (int j = i; j >= 0 && nums[j] % k == 0; j--) {
if (nums[j] == k) {
flag = true;
}
g = g.gcd(BigInteger.valueOf(nums[j]));
if (flag || g.intValue() == k) {
ans++;
}
}
}
return ans;
}
6216. 使数组相等的最小开销
最终相等的元素k一定在nums的最小值与最大值之间,且最终相等的元素k在最佳的左侧开销是单调递减,在最佳值的右侧是单调递增的,只有在最佳位置才是比左右侧的消耗都小,所以可以用二分法去计算最佳的点。
class Solution {
public long minCost(int[] nums, int[] cost) {
int left = nums[0], right = nums[0], n = nums.length;
if (n == 1) {
return 0;
}
for (int i = 0; i < n; i++) {
left = Math.min(left,nums[i]);
right = Math.max(right,nums[i]);
}
while (left < right) {
int mid = (right - left) / 2 + left;
long m = calculate(nums,cost,mid);
long m2 = calculate(nums,cost,mid+1);
if (m < m2) {
right = mid;
} else {
left = mid + 1;
}
}
return calculate(nums,cost,left);
}
public long calculate(int[] nums, int[] cost, int k) {
int i = 0;
long sum = 0l;
while (i < nums.length) {
sum += (long)Math.abs(k-nums[i]) * cost[i];
i++;
}
return sum;
}
}