其他分享
首页 > 其他分享> > 【Leetcode】-滑动窗口

【Leetcode】-滑动窗口

作者:互联网

题目

  1. 最大连续1的个数 III

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

解题思路

  1. 双指针,右指针主动移动,做指正只有当zeros 不满足条件时候被迫移动
    最后返回结果是区间长度

代码

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();
        int left = 0;
        int zeros = 0;
        int res = 0;
        for(int right=0; right<n;right++)
        {
            if(nums[right]==0)
            {
                zeros++;
            }
            while(zeros>k)
            {
                if(nums[left]==0)
                {
                    zeros--;
                }
                left++;
            }
            res = max(res,right-left+1);
        }
        return res;
    }
};

class Solution:
    def longestOnes(self, nums: List[int], k: int) -> int:
        n = len(nums)
        res = 0
        zeros = 0 
        left = 0
        for i in range(n):
            if (nums[i]==0):
                zeros+=1
            while zeros>k:
                if(nums[left]==0):
                    zeros-=1
                left += 1
            res = max(res,i-left+1)
        return res

题目

  1. 替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。

在执行上述操作后,返回包含相同字母的最长子字符串的长度。

解题思路

  1. 跟上一题区别在于这里左指针移动的条件是需要替换的字符大于给定的字符;
    需要计算出需要替换的字符
    等于区间长度 - 区间出现重复次数最多的字符的个数
    使用一个数组存放字符出现的次数,用字符大小作为索引下标,索引下标对应的数值即为个数;

代码

class Solution {
public:
    int characterReplacement(string s, int k) {
        vector<int> arr(26, 0);
        int maxIdx=0,left=0;
        int n = s.size();
        int res = 0;
        for(int right=0;right<n;right++)
        {
            int curIdx = s[right]-'A';
            arr[curIdx]++;
            // 更新区间字符次数最多的索引
            if(arr[curIdx]>arr[maxIdx])
            {
                maxIdx = curIdx;
            }

            //计算需要替换的个数
            int recnt = (right-left+1)-arr[maxIdx];
            if(recnt>k)
            {
                arr[s[left]-'A']--;
                left++;
            }
            
            if(recnt<=k)
            {
                res = max(res, right-left+1);
            }
           
        }
        return res;
    }
};

Python

class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        pre = [0]*26
        res, left, maxIdx, curIdx = 0, 0, 0, 0
        n = len(s)
        for right in range(n):
            curIdx = ord(s[right])-ord('A')
            print(curIdx)
            pre[curIdx] += 1
            if(pre[curIdx]>pre[maxIdx]):
                maxIdx = curIdx
            
            recnt = (right-left+1)-pre[maxIdx]
            if (recnt>k):
                pre[ord(s[left])-ord('A')] -= 1
                left += 1
            if (recnt<=k):
                res = max(res,right-left+1)
        return res
            

标签:right,窗口,nums,int,res,maxIdx,滑动,Leetcode,left
来源: https://www.cnblogs.com/Jucw/p/16216467.html