第一题
class Solution {
public int minimumDifference(int[] nums, int k) {
Arrays.sort(nums);
int min=100;
int num2[]=new int[k];
if(k==1){
min=0;
}else{
for(int i=0;i<nums.length-1;i++){
int m=0;
while(m<k){
num2[m]=nums[i];
m++;
}
min=Math.min(min,(num2[k-1]-num2[0]));
}
}
return min;
}
}
思路:首先对nums数组排序,便于出k个相邻的元素 的最小差值,再对多组最小差值进行比较,得出整个数组中k个相邻的元素 的最小差值。
第二题
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int num=0;
for(int i=0;i<nums.length;i++){
int ji=1;
int m=0;
while(i<nums.length&&ji*nums[i]<k){
ji*=nums[i];
i++;
m++;
}
num+=m;
i-=m;
}
return num;
}
}
思路:先遍历数组nums,将从nums[i]开始相邻的元素乘积与k比较,小于k则 m++,将所有m加起来就是元素乘积小于k的子数组数量。
第三题
class Solution {
public int maxConsecutiveAnswers(String answerKey, int k) {
return Math.max(maxConsecutiveChar(answerKey,k,'T'),maxConsecutiveChar(answerKey,k,'F'));
}
public int maxConsecutiveChar(String answerKey, int k, char ch) {
int n = answerKey.length();
int ans = 0;
for (int left = 0, right = 0, sum = 0; right < n; right++) {
sum += answerKey.charAt(right) != ch ? 1 : 0;
while (sum > k) {
sum -= answerKey.charAt(left++) != ch ? 1 : 0;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
思路:通过写一个方法,分别判断是修改T还是修改F可得到最长子串。用两个指针来制作一个滑动窗口,以right指针为主,T为例,如果所读的字符不是T,则表示这个字符可能需要修改,sum加一。如果sum>k则需要left指针来保证需修改字符数量不得大于k。left指针右移,当读到字符为F时,sum减一,直至sum<=k,才可计算left指针到right指针之间元素个数。所得个数用ans记录,每次将较大的数付给ans,最终得到修改k次后最长子串。