当前位置: 代码网 > it编程>游戏开发>ar > 【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

2024年07月31日 ar 我要评论
然后进行判断,如果sum>target,更新结果并出窗口(也就是left++);:找出最长的子数组的长度(len),所有元素的和正好等于sum-x(target),那么最后求的就是n-len的最小值。有重复字符就出窗口(left++),从哈希表中删除该字符,这个过程需要一直重复,直到left找到重复的字符。判断(zero>k) 并决定什么时候出窗口(left++,计数器-1)然后开始进窗口(right++),right指向3,sum从0变为2,进窗口:right++,如果是1,无视;

1. 长度最小的子数组 - 力扣(leetcode)

1.题目解析:

2.算法原理

(1)方法一:暴力列举出所有的子数组的和

时间复杂度:o(n**2):枚举所有子数组o(n**2)

(2)方法二:

利用单调性(两个指针都不回退),使用"同向双指针"(其实就是滑动窗口)来优化

3.代码实现

class solution {
    public int minsubarraylen(int target, int[] nums) {
        int sum = 0;
        int ret = integer.max_value;
        for(int left=0,right=0;right<nums.length;right++) {
            sum+=nums[right];//进窗口
            while(sum>=target) {//判断
                ret = math.min(right-left+1,ret);//更新结果
                sum-=nums[left];
                left++;
            }
        }
        //要考虑特殊情况:不存在
        return ret==integer.max_value ? 0:ret;
    }
}

2. 无重复字符的最长子串 - 力扣(leetcode)

1.题目解析:

2.算法原理

3.代码实现

class solution {
    public int lengthoflongestsubstring(string s) {
        char[] ss = s.tochararray();//字符串转为字符数组
        int[] hash = new int[128]; //用数组模拟哈希表

        int len = 0;
        for(int left=0,right=0;right<s.length();right++) {
            //进窗口
            hash[ss[right]]++;
            while(hash[ss[right]]>1) {//有重复字符
                //删除
                hash[ss[left]]--;
                //出窗口
                left++;
            }
            //更新结果
            len = math.max(len,right-left+1);
        }
        return len;
    }
}

3. 最大连续1的个数 iii - 力扣(leetcode)

1.题目解析:

2.算法原理:

问题转化:找出最长的子数组,0的个数不超过k个

3.代码实现:

class solution {
    public int longestones(int[] nums, int k) {
        int count=0;
        int zero=0;
        for(int left=0,right=0;right<nums.length;right++) {
            //进窗口
            if(nums[right]==0){
                zero++;
            }
            while(zero>k) {//判断:0的个数超过k个
                //出窗口
                if(nums[left]==0) {
                    zero--;
                }
                left++;
            }
            count=math.max(count,right-left+1);
        }
        return count;
    }
}

1658. 将 x 减到 0 的最小操作数 - 力扣(leetcode)

1.题目解析:

2.算法原理:

3.代码实现:

class solution {
    public int minoperations(int[] nums, int x) {
        int sum=0;
        for(int a:nums) sum+=a;
        int sum=0;
        int target = sum-x;
        //处理细节
        if(target<0) {
            return -1;
        }
        int ret=-1;
        for(int left=0,right=0;right<nums.length;right++) {
            //进窗口
            sum+=nums[right];
            //判断
            while(sum>target) {
                //出窗口
                sum-=nums[left++];
            }
            //更新结果
            if(sum==target) {
                ret=math.max(right-left+1,ret);
            }
        }
        return (ret==-1)?(-1):(nums.length-ret);
    }
}

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com