Python算法练习 9.12

news/2024/11/30 9:41:49/

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 = 0right = left + k - 1i = 0windowSum = 0while i < k:windowSum += nums[i]i += 1maxAvg = windowSum / float(k)while right + 1 < len(nums):windowSum = windowSum - nums[left] + nums[right+1]maxAvg = max(maxAvg, windowSum / float(k))left += 1right += 1return maxAvg

 

 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 = 0right = left + k - 1maxCount = 0i = 0while i <= right:if s[i] in yuanyin:maxCount += 1i += 1while right + 1 < len(s):currentCount = 0if s[right+1] in yuanyin and s[left] not in yuanyin:i = left + 1while i <= right + 1:if s[i] in yuanyin:currentCount += 1i += 1maxCount = max(currentCount, maxCount)left += 1right += 1return maxCount

 

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

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

 

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 = 0maxlen = 0for right in range(n):rnum += 1 - nums[right]while lnum < rnum - k:lnum += 1 - nums[left] left += 1maxlen = max(maxlen, right - left + 1)return maxlen


http://www.ppmy.cn/news/1107372.html

相关文章

聚观早报|蚂蚁集团发布“蚁天鉴”;vivo X100系列即将亮相

【聚观365】9月12日消息 蚂蚁集团发布“蚁天鉴” vivo X100系列即将亮相 台积电8月份营收59亿美元 8月公共充电桩环比增加6.1万台 吴泳铭接替张勇出任阿里云代理董事长与CEO 蚂蚁集团发布“蚁天鉴” 蚂蚁集团发布大模型安全一体化解决方案“蚁天鉴”。该方案包含了大模型…

代码随想录--数组--长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3]输出&#xff1a;2…

浅谈Dead reckoning实现原理以及常用算法

0. 简介 航位推算是一个很常见的定位方法。在知道当前时刻的位置&#xff0c;然后通过imu等传感器去估计下一个时刻的位置。在自动驾驶车辆定位的时候&#xff0c;GPS提供10Hz的定位信息。这每个GPS信息来临的0.1s的间隔里面&#xff0c;车辆位置也会移动很多。那么这个时候就…

代码随想录34|62.不同路径,63. 不同路径 II,343. 整数拆分

62.不同路径 链接地址 class Solution { public:int uniquePaths(int m, int n) {//初始化vector<vector<int>> dp(m, vector<int>(n, 0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; i) {…

软件评测师之CPU的构成

目录 一、CPU的构成二、考法考法1&#xff1a;CPU中运算器/控制器的作用考法2&#xff1a;CPU中寄存器的作用考法3&#xff1a;CPU中运算器/控制器的构成考法4&#xff1a;CPU的构成 一、CPU的构成 计算机由输入设备、输出设备、存储器、运算器、控制器组成。中央处理器(CPU)又…

solidworks底部状态栏显示不出来

如下图所示&#xff0c;solidworks主界面下面的状态栏突然不见了。 怎么调出来&#xff1f; 第一步&#xff1a;点击视图菜单&#xff0c;用户界面&#xff0c;把状态栏前的勾勾上。 第二步&#xff1a;把视图下面的触摸模式关掉&#xff0c;这一点很容易被大家忽略。

领域驱动设计:事件风暴构建领域模型

文章目录 事件风暴需要准备些什么&#xff1f;如何用事件风暴构建领域模型&#xff1f; 事件风暴是一项团队活动&#xff0c;领域专家与项目团队通过头脑风暴的形式&#xff0c;罗列出领域中所有的领域事件&#xff0c;整合之后形成最终的领域事件集合&#xff0c;然后对每一个…

平衡二叉树

平衡二叉树的纠正 左左&#xff0c;右右可以解决&#xff0c;左右&#xff0c;右左需要先转换成左左&#xff0c;右右。即递归的解决左左&#xff0c;右右。 红黑树是一种二叉查找树&#xff0c;但不是高度平衡的&#xff0c;平衡二叉树的查找效率很高&#xff0c;但维护平衡二…