008.长度最小的子数组
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3]
是该条件下的长度最小的子数组。
思路:
1.定义两个变量来标定窗口的边界
2.进窗口
3.判断,出窗口,更新结果
4.循环2、3
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int sum = 0;
int len = INT_MAX;
while(right < nums.size())
{
sum += nums[right];//进窗口
while(sum >= target)
{
len = min(len, right-left+1);//更新结果
//出窗口
sum -= nums[left];
++left;
}
++right;
}
return len == INT_MAX? 0 : len;
}
3.无重复字符的最长子串
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"
,所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b"
,所以其长度为 1。
1004.最大连续1的个数
给定一个二进制数组
nums
和一个整数k
,如果可以翻转最多k
个0
,则返回 数组中连续1
的最大个数 。示例 1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
思路:
1.创建窗口
2.数据进入窗口,并判断0的数量与k的关系。如果大于k,窗口左边将最前面的一个0及其前数据排出
3.继续循环判断
int longestOnes(vector<int>& nums, int k) {
int left = 0;
int right = 0;
int zero = 0;
int ret = 0;
while(right < nums.size())
{
if(nums[right] == 0)//进窗口
{
++zero;
}
if(zero > k)//判断
{
if(nums[left] == 0)//出窗口
{
--zero;
}
++left;
}
ret = max(ret, right-left+1);
++right;
}
return ret;
}
1658.将x减小到0的最小操作数
给你一个整数数组
nums
和一个整数x
。每一次操作时,你应当移除数组nums
最左边或最右边的元素,然后从x
中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。如果可以将
x
恰好 减到0
,返回 最小操作数 ;否则,返回-1
。示例 1:
输入:nums = [3,2,20,1,1,3], x = 10 输出:5 解释:最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0 。