Python算法练习 9.12

leetcode 643 子数组最大平均数

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
class Solution(object):
    def findMaxAverage(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: float
        """
        left = 0
        right = left + k - 1
        i = 0
        windowSum = 0
        while i < k:
            windowSum += nums[i]
            i += 1
        maxAvg = windowSum / float(k)
        while right + 1 < len(nums):
            windowSum = windowSum - nums[left] + nums[right+1]
            maxAvg = max(maxAvg, windowSum / float(k))
            left += 1
            right += 1
        return maxAvg

Python算法练习 9.12_第1张图片 

 k不变,可以先求区间最大和,最后再除

leetcode 1456 定长子串中元音的最大数目

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(aeiou)。

分析:

先计算初始窗口元音的个数

窗口移动,1 右端进入元音 左边退出非元音 最大个数+1

2 右端进入元音 左边退出元音 最大个数不变

3 右边进入非元音 无论左边退出什么 最大个数不变

s所以仅在情况1时重新计算窗口中的元音个数,然后与maxCount比较

(附自己的代码,超时了。。)

class Solution(object):
    def maxVowels(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        yuanyin = ['a', 'e', 'i', 'o', 'u']
        left = 0
        right = left + k - 1
        maxCount = 0
        i = 0
        while i <= right:
            if s[i] in yuanyin:
                maxCount += 1
            i += 1
        while right + 1 < len(s):
            currentCount = 0
            if s[right+1] in yuanyin and s[left] not in yuanyin:
                i = left + 1
                while i <= right + 1:
                    if s[i] in yuanyin:
                        currentCount += 1
                    i += 1
            maxCount = max(currentCount, maxCount)
            left += 1
            right += 1
        return maxCount

 

 修改版:勉强通过,去掉了双重循环,每次记录窗口的元音个数

class Solution(object):
    def maxVowels(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        yuanyin = ['a', 'e', 'i', 'o', 'u']
        left = 0
        right = left + k - 1
        maxCount = 0
        i = 0
        while i <= right:
            if s[i] in yuanyin:
                maxCount += 1
            i += 1
        currentCount = maxCount
        while right + 1 < len(s):
            if s[right+1] in yuanyin and s[left] not in yuanyin:
                currentCount += 1
            if s[right+1] not in yuanyin and s[left] in yuanyin:
                currentCount -= 1
            maxCount = max(currentCount, maxCount)
            left += 1
            right += 1
        return maxCount

 Python算法练习 9.12_第2张图片

leetcode 1004 最大连续1的个数III

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

输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。

没思路直接看题解

分析:

先问题转换:滑动窗口解法,right所在位置的前缀中0的个数减去left所在位置前缀和中0的个数小于等于k,如果要right-left+1最大,那么就中间0的个数都等于k,一旦它们之间0的个数多于k,再让left往右赶

class Solution(object):
    def longestOnes(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        n = len(nums)
        # lnum 窗口左侧位置的前缀0总数
        # rnum 窗口右侧位置的前缀0总数
        lnum = rnum = left = 0
        maxlen = 0
        for right in range(n):
            rnum += 1 - nums[right]
            while lnum < rnum - k:
                lnum += 1 - nums[left] 
                left += 1
            maxlen = max(maxlen, right - left + 1)
        return maxlen

你可能感兴趣的:(算法练习,python,算法)