目录
[将 x 减到 0 的最小操作数](#将 x 减到 0 的最小操作数)
滑动窗口 : 通常通过两个指针(左指针和右指针,同向指针)来定义窗口的边界。右指针用于扩展窗口,左指针用于收缩窗口,通过调整指针位置来找到满足条件的解。
还是从题目出发更容易理解
长度最小的子数组

java
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int n = nums.length;
int len = Integer.MAX_VALUE;
for(int left = 0,right = 0; right < n ; right++){
sum += nums[right] ;//进窗口
while(sum >= target)//判断
{
len = Math.min(len, right - left + 1);
sum -= nums[left++];//出窗口 + 结果更新
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}
}
无重复字符的最长子串
有了上一个题的基础 本题稍稍做了难度的提升

java
public int lengthOfLongestSubstring(String s) {
char[] s1 = s.toCharArray();
int [] hash = new int[128];
int n = s.length();
int left =0;
int right =0;
int ret = 0;
while(right < n){
hash[s1[right]]++;
while(hash[s1[right]] > 1){
hash[s1[left++]]--;
}
ret = Math.max(ret , right - left + 1);
right++;
}
return ret;
}
最大连续1个数

java
public int longestOnes(int[] nums, int k) {
int n =nums.length;
int ret = 0;
for(int right = 0,left = 0,zero = 0; right < n ; right++){
if(nums[right] == 0)//进窗口
{
zero++;
}
while(zero > k)//判断
{
if(nums[left++] == 0)//出窗口
{
zero--;
}
}
ret = Math.max(ret,right - left + 1);
}
return ret;
}
将 x 减到 0 的最小操作数

java
public int minOperations(int[] nums, int x) {
int n = nums.length;
int sum = 0;
for(int a : nums){
sum += a;
}
int target = sum - x;
//细节处理
if(target < 0)
return -1;
int len = -1;
for(int right = 0, left = 0,tmp = 0; right < n ; right++){
tmp += nums[right];
while(tmp > target){
tmp -= nums[left++];
}
if(tmp == target){
len = Math.max(len,right - left + 1);
}
}
if(len == -1)
return len;
return n - len;
}