第一题
leetcode992. K 个不同整数的子数组
思路:1.滑动窗口(两个)
2.技巧:k = k = (小于等于k) - (小于等于k-1)
public class 第一题13 {
public static void main(String[] args) {
int[] nums = {1,2,1,2,3};
int res = subarraysWithKDistinct1(nums, 2);
System.out.println(res);
}
//滑动窗口(两个)
public static int subarraysWithKDistinct1(int[] nums, int k) {
int n = nums.length;
int ans = 0;
int lessLeft = 0;
int equalLeft = 0;
int lessCount = 0;
int equalCount = 0;
int[] lessMap = new int[n + 1];
int[] equalMap = new int[n + 1];
for (int i = 0;i < n;i++){
if (lessMap[nums[i]] == 0){
lessCount++;
}
if (equalMap[nums[i]] == 0){
equalCount++;
}
lessMap[nums[i]]++;
equalMap[nums[i]]++;
while (lessCount == k){
if (lessMap[nums[lessLeft]] == 1){
lessCount--;
}
lessMap[nums[lessLeft++]]--;
}
while (equalCount > k){
if (equalMap[nums[equalLeft]] == 1){
equalCount--;
}
equalMap[nums[equalLeft++]]--;
}
ans += lessLeft - equalLeft;
}
return ans;
}
//技巧:k = (小于等于k) - (小于等于k-1)
public static int subarraysWithKDistinct2(int[] nums, int k) {
return maxCount(nums,k) - maxCount(nums,k - 1);
}
private static int maxCount(int[] nums, int k) {
int n = nums.length;
HashMap<Integer, Integer> map = new HashMap<>();
int count = 0;
int left = 0;
int ans = 0;
for (int i = 0;i < n;i++){
if (map.getOrDefault(nums[i],0) == 0){
count++;
}
map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
while (count > k){
if (map.get(nums[left]) == 1){
count--;
}
map.put(nums[left],map.get(nums[left]) - 1);
left++;
}
ans += i - left;
}
return ans;
}
}
第二题
思路:贪心
public class 第二题13 {
public static void main(String[] args) {
int[] arr = {1,3,9,10,13,21,23,36};
int res = minSplit(arr, 2, 4);
System.out.println(res);
}
public static int minSplit(int[] arr,int k,int x){
int n = arr.length;
int[] need = new int[n];
int index = 0;
int splitCount = 1;
for (int i = 0;i < n - 1;i++){
if (arr[i + 1] - arr[i] > x){
need[index++] = arr[i + 1] - arr[i];
splitCount++;
}
}
Arrays.sort(need,0,index);
for (int i = 0;i < index;i++){
int count = (need[i] - 1) / x;
if (k >= count){
k -= count;
splitCount--;
}else {
break;
}
}
return splitCount;
}
}