一、LeetCode 1004 最大连续1的个数III
题目描述:
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
思路:
双指针表示滑动窗口
左边界不动,右边界往右边滑动,寻找
代码如下:
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int l=0,res=0,cnt=0;
for(int r=0;r<A.size();r++){
if(A[r]==0) cnt++;;
while(cnt>K){
if(A[l]==0) {
cnt--;
}
l++;
}
res=max(res,r-l+1);
}
return res;
}
};
二、LeetCode 209 长度最小的子数组
题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路:
同样是双指针表示滑动窗口
开始左右边界都在最左边,然后右边界慢慢右移
在判断条件的约束下,左边界再右移
代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int res=INT_MAX;
int left=0,sum=0;
for(int right=0;right<nums.size();right++){
sum+=nums[right];
while(sum>=s){
res=min(res,right-left+1);
sum-=nums[left];
left++;
}
}
return res==INT_MAX?0:res;
}
};
三、LeetCode 845 数组中的最长山脉
题目描述:
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
B.length >= 3
存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1]
(注意:B 可以是 A 的任意子数组,包括整个数组 A。)
给出一个整数数组 A,返回最长 “山脉” 的长度。
如果不含有 “山脉” 则返回 0。
思路:
对于每一个位置,当成山顶,都遍历一遍
代码如下:
class Solution {
public:
int longestMountain(vector<int>& arr) {
if(arr.size()<3) return 0;
int l=0,r=0;
int res=0;
for(int i=1;i<arr.size()-1;i++){
if(arr[i-1]<arr[i]&&arr[i]>arr[i+1]){
l=i-1;
r=i+1;
while(l>0&&arr[l-1]<arr[l]){
l--;
}
while(r<arr.size()-1&&arr[r+1]<arr[r]){
r++;
}
res=max(res,r-l+1);
}
}
return res;
}
};
四、LeetCode 11 盛水最多的容器
题目描述:
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
思路:
双指针,左指针在最左边,右指针在最右边,从两边往中间收缩
代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int l=0,r=height.size()-1;
int res=0;
while(l<r){
res=max(res,(r-l)*min(height[l],height[r]));
if(height[l]<height[r]){
l++;
}
else{
r--;
}
}
return res;
}
};
五、LeetCode 567 字符串的排列
题目描述:
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
思路:
滑动窗口比较
代码如下:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if(s1.size()>s2.size()) return false;
vector<int>mp1(26,0);
vector<int>mp2(26,0);
int n=s1.size();
for(int i=0;i<n;i++){
mp1[s1[i]-'a']++;
mp2[s2[i]-'a']++;
}
if(mp1==mp2) return true;
for(int i=n;i<s2.size();i++){
mp2[s2[i-n]-'a']--;
mp2[s2[i]-'a']++;
if(mp1==mp2) return true;
}
return false;
}
};