1004、2024.利用滑动窗口解题

leetcode题库1004最大连续1的个数、2024考试的最大困扰度

1004题目要求

给定一个二进制数组 nums 和一个整数 k ,如果可以翻转最多k0 ,则返回 数组中连续 1 的最大个数

 

 

思路

  1. 考虑k是否大于等于nums的长度,如果是,则返回的数组中连续1的最大个数就是k。

  2. 定义一个左指针left和一个右指针right,指向滑动窗口的左端和右端,定义一个zero表示滑动窗口内0的数量,初始指针都指向头;只要窗口内的”0“的数量小于等于k,且right的指向没有超过数组nums的长度,right指针就可以向右移动一格,right指针移动前的胡滑动窗口大小为right-left+1;如果此时right指针指向0,表示滑动窗口进入了一个0,滑动窗口内0的数量加一,如果滑动窗口内的0的数量大于k时,将left指针右移,直至使滑动窗口内0的数量减少1(nums[left-1]==0),直到right指针移动到最右端时,期间滑动窗口的最大值就是数组中连续的1的最大个数。详细请看代码。

代码

public int longestOnes(int[] nums, int k) {
        int maxsize=0;
        int right=0,left=0;
        int zero=0;
        if (k >= nums.length) {
            return k;
        }
        while (zero <= k && right < nums.length) {
            if (nums[right] == 0) {
                zero++;
            }
            while (zero > k) {
                left++;
                if (nums[left - 1] == 0) {
                    zero--;
                }
            }
            maxsize = Math.max(maxsize, right - left + 1);
            right++;
        }

        return maxsize;
    }

类似题目

2024、考试的最大困扰度

题目要求

一位老师正在出一场由 n 道判断题构成的考试,每道题的答案为 true (用 'T' 表示)或者 false (用 'F' 表示)。老师想增加学生对自己做出答案的不确定性,方法是 最大化 有 连续相同 结果的题数。(也就是连续出现 true 或者连续出现 false)。

给你一个字符串 answerKey ,其中 answerKey[i] 是第 i 个问题的正确结果。除此以外,还给你一个整数 k ,表示你能进行以下操作的最多次数:

每次操作中,将问题的正确答案改为 'T' 或者 'F' (也就是将 answerKey[i] 改为 'T' 或者 'F' )。 请你返回在不超过 k 次操作的情况下,最大 连续 'T' 或者 'F' 的数目。

 

 

代码

public int maxConsecutiveAnswers(String answerKey, int k) {
        int maxT=0,maxF=0,max;
        int left = 0, right = 0;
        int TorF=0;
        int N = answerKey.length();
        if (k >= N) {
            return k;
        }
        while (TorF <= k && right < N) {
            if (answerKey.charAt(right) == 'F') {
                TorF++;
            }
            while (TorF > k) {
                left++;
                if (answerKey.charAt(left-1) == 'F') {
                    TorF--;
                }
            }
            maxT = Math.max(maxT, right - left + 1);
            right++;
        }
        left=0;
        right=0;
        TorF=0;
        while (TorF <= k && right < N) {
            if (answerKey.charAt(right) == 'T') {
                TorF++;
            }
            while (TorF > k) {
                left++;
                if (answerKey.charAt(left-1) == 'T') {
                    TorF--;
                }
            }
            maxF = Math.max(maxF, right - left + 1);
            right++;
        }
        max = Math.max(maxT, maxF);
        return max;
    }
posted @ 2022-02-25 16:36  彬不冰  阅读(59)  评论(0)    收藏  举报