前面三题都是关于滑动窗口的题目,也是我第一次刷这种类型的题目,会的不是很多,也是参考了一些别人的代码才写出来的,还需要多多巩固利用滑动窗口来对题目进行求解。
第一题
class Solution {
public int minimumDifference(int[] nums, int k) {
int n=nums.length;
Arrays.sort(nums);
int a,b;
int maxx=10000005;
for(int i=0;i<n-k+1;i++){
a=nums[i];
b=nums[i+k-1];
maxx=Math.min(maxx,b-a);
}
return maxx;
}
}
第二题
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int res = 0, p = 1;
for(int i = 0, j = 0; i < nums.length; i++){
p *= nums[i];
while(j <= i && p >= k) p /= nums[j++];
res += i - j + 1;
}
return res;
}
}
第三题
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int cntT = 0, cntF = 0, res = 0;
int n = answerKey.length();
for(int left = 0, right = 0;right < n; ++right){
if(answerKey[right] == 'T')
cntT++;
else
cntF++;
if(cntT > k && cntF > k){
if(answerKey[left] == 'T')
cntT--;
else
cntF--;
++left;
}
res = max(res, right-left+1);
}
return res;
}
};
第四题
题目要求是对大于等于2取余,所以判断是否为1即可为一种不符合题目的情况
另一种情况是:如果两个相邻数之间差为1,那么肯定会有一个数求余之后为1,也不符合条件。
#include<bitsdc++.h>
using namespace std;
const int maxn = 1e5;
int n, k;
int a[maxn];
void solve()
{
cin>>n;
int x;
int flag1 = 0;
for (int i = 0; i < n; ++i)
{
cin>>a[i];
if (a[i] == 1)
{
flag1 = 1;
}
}
sort (a, a + n);
int flag2 = 0;
for (int i = 1; i < n; ++i)
{
if (a[i] == a[i-1] + 1)
{
flag2 = 1;
break;
}
}
if(!flag1 || !flag2)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
int main()
{
int t;
cin>>t;
while (t--)
{
solve();
}
}