滑动窗口技巧解算法题-leetcode算法题

算法思想:

1、在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。

2、先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求。

3、此时,停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求。同时,每次增加 left,都要更新一轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

算法框架:

int left = 0, right = 0;

while (right < s.size()) {
    window.add(s[right]);
    right++;
    
    while (valid) {
        window.remove(s[left]);
        left++;
    }
}

leetcode无重复字符的最长子串

题目描述:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //使用双指针的方式
        int left=0;
        int right=0;
        int n=s.length();
        int result = 0;
        //记录每个字符出现的次数  里面的字符包括字母和数字,
        int[] count = new int[128];
        while(right<n){
            //移动右指针
            char c1 = s.charAt(right);
            count[c1]++;
            right++;
            //缩小左指针
            while(count[c1]>1){
                char c2 = s.charAt(left);
                count[c2]--;
                left++;
            }
            result = Math.max(result,right-left);
        }
        return result;
    }
}

leetcode长度最小的子数组

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left=0;
        int right=0;
        int n=nums.length;
        int sum = 0;  //计算子数组的和
        int result = n;
        boolean flag = false;
        int count = 0;  //类似于一个标记,看看有没有出现过sum>=target
        while(right<n){
            sum+=nums[right];  //将nums[right]加入进来
            right++;
            while(sum>=target){
                sum-=nums[left];
                left++;
                flag=true;
                count++;
            }
            if(flag==true){
                //只要当sum>=target  计算出来的子数组才有意义
                left--;
                sum+=nums[left];
                result=Math.min(result,right-left);              
            }
            flag=false;
        }
        if(count==0){
            //从来没有出现过sum>=target
            return 0;
        }
        return result;
    }
}

leetcode颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

class Solution {
    public void sortColors(int[] nums) {
        //0 表示红色  1 表示红白色  2 表示蓝色
        /*三指针法,设立三个指针i,j,k
        其中j为当前工作指针,
        i以前的元素全部为红色
        k以后的元素全部为蓝色
        */
        int i=0;
        int j=0;
        int k=nums.length-1;
        while(j<=k){
            if(nums[j]==0){
                //表示当前元素为红色  得尽量放前面
                int temp = nums[i];
                nums[i]=nums[j];
                nums[j]=temp;
                i++;
                j++;
            } else if(nums[j]==1){
                //表示当前元素为白色  不动
                j++;
            } else{
                //表示当前元素为蓝色  得尽量放后面
                int temp = nums[k];
                nums[k]=nums[j];
                nums[j]=temp;
                k--;
                //这里没有j++  主要防止交换后nums[j]还是为蓝色
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值