![在这里插入图片描述](https://img-blog.csdnimg.cn/6970ee8352bb4fb5b2f9ee7e39aa1a75.png#pic_center)
📘北尘_:个人主页
🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》
☀️走在路上,不忘来时的初心
文章目录
- 一、将x减到0的最小操作数
-
- 二、无重复的最长子串
-
- 三、最大连续为1的个数
-
- 四、长度最小的子数组
-
一、将x减到0的最小操作数
1、题目讲解
![在这里插入图片描述](https://img-blog.csdnimg.cn/9d9307d4e98a4ba0a708eb970ffeea26.png)
2、讲解算法原理
![在这里插入图片描述](https://img-blog.csdnimg.cn/ca851670b0db440196129c475abee329.png)
3、代码实现
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int n=nums.size(),ret=0,sum=0,target,len=-1;
for(int i=0;i<n;i++)
ret+=nums[i];
target=ret-x;
if(target<0) return -1;
for(int left=0,right=0;right<n;right++)
{
sum+=nums[right];
while(sum>target)
sum-=nums[left++];
if(sum==target)
len=max(len,right-left+1);
}
if(len==-1) return len;
else return n-len;
}
};
二、无重复的最长子串
1、题目讲解
![在这里插入图片描述](https://img-blog.csdnimg.cn/7447d9186f0b4181926c76641699fee4.png)
2、讲解算法原理
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e9f662425bb4d77a379de92f4ba069c.png)
3、代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size();
int count[128]={0},len=0;
for(int left=0,right=0;right<n;right++)
{
count[s[right]]++;
while(count[s[right]]==2)
count[s[left++]]--;
len=max(len,right-left+1);
}
return len;
}
};
三、最大连续为1的个数
1、题目讲解
![在这里插入图片描述](https://img-blog.csdnimg.cn/c315c79c9b2d451391fea9edfc2f5c9e.png)
2、讲解算法原理
![在这里插入图片描述](https://img-blog.csdnimg.cn/be187626e3044a8296e9008dc71e863a.png)
3、代码实现
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int n=nums.size(),zero=0,len=0;
for(int left=0,right=0;right<n;right++)
{
if(nums[right]==0) zero++;
while(zero>k)
if(nums[left++]==0) zero--;
}
return len;
}
};
四、长度最小的子数组
1、题目讲解
![在这里插入图片描述](https://img-blog.csdnimg.cn/86755934ffdc41d19f7c0c1e5fccbc59.png)
2、讲解算法原理
![在这里插入图片描述](https://img-blog.csdnimg.cn/65c4afacbbe64d3e9fc147a0ef201aee.png)
3、代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int n=nums.size(),len=INT_MAX;
int sum=0;
for(int left=0,right=0;right<n;right++)
{
sum+=nums[right];
while(sum>=target)
{
len=min(len,right-left+1);
sum-=nums[left];
left++;
}
}
return len==INT_MAX?0:len;
}
};