【LeetCode】数组-1(643)-返回规定长度k的最大子数组的平均数
好久没有刷LeetCode了,准备重拾并坚持下去,每天刷个两小时。今天算是开始的第一天,不过出师不利,在一道很简单的题目上墨迹半天。不过还好,现在踩过的坑,应该都不会白踩,这些可能都是以后程序员路上稳固的基石哦。任何优秀的程序员不都是这样过来的嘛,坚持就好。
注意:大家练习时同样要注意代码的风格,这一点推荐上lintcode测试一下,练习几次风格自然就好了。
下面开始写第一题的解题过程(包括写错的过程)
思路一:累加数组
1. 求出数组的累加数组(循环遍历,每一项等于前一项的和)
2. k个数的和等于 i 位置上的数减去 i - k 位置上的数(对于坐标比较迷糊的同学,推荐你们在稿纸上画画就明白了)。
第一遍错误的代码(黄色标记处错误):
public class Solution {
public double findMaxAverage(int[] nums, int k) {
if (nums == null || nums.length < 1) {
return -1;
}
int[] ans = new int[nums.length];
double maxSum = 0;
ans[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
ans[i] = nums[i] + nums[i - 1];
}
maxSum = ans[k - 1];
for (int i = k; i < nums.length; i++) {
double curSum = (double)ans[i] - ans[i - k];
if (curSum > maxSum) {
maxSum = curSum;
}else {
continue;
}
}
return maxSum / k;
}
}
nums改成ans就正确了。
时间复杂度:O(n)只是两遍遍历,没有嵌套。
空间复杂度:O(n)申请了一个数组
思路二:滑动窗口
维护一个“和”数组,只有k个元素,从k+1开始,每次右边加一个元素,左边减一个元素。
相比一的好处:不用申请数组了,而且效率也高了,减少了重复计算。
这次终于BugFree了,不容易啊。
public class Solution {
public double findMaxAverage(int[] nums, int k) {
if (nums.length < 1 || nums == null) {
return -1;
}
int sum = 0;
int max = 0;
for (int i = 0; i < k; i++) {
sum += nums[i];// 先求前k个数的和,之后不断维护这个数组即可。
max = sum;
}
for (int i = k; i < nums.length; i++) {
sum += nums[i] - nums[i - k];
if (sum > max) {
max = sum;
}
}
return max * 1.0 / k;
}
}
时间复杂度:O(n)只是遍历一遍
空间复杂度:O(1)
【LeetCode】数组-1(643)-返回规定长度k的最大子数组的平均数的更多相关文章
- 数组中累加和为k的最大子数组的长度
package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...
- 【LeetCode】974. 和可被 K 整除的子数组
974. 和可被 K 整除的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例 输入:A = [4,5,0,-2,-3, ...
- 【LeetCode】862. 和至少为 K 的最短子数组
862. 和至少为 K 的最短子数组 知识点:单调:队列:前缀和 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 ...
- 数组中累加和小于等于k的最长子数组
问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...
- 643. Maximum Average Subarray I 最大子数组的平均值
[抄题]: Given an array consisting of n integers, find the contiguous subarray of given length k that h ...
- JavaScript Array返回值以及是否改变原数组。
1. push:最后一位新增://改变原数组 arr.push("123"); 返回值是数组的长度: var b = ...
- CLRS最大子数组问题
今天我们一起来看一下关于最大子数组的一些问题.最大子数组的应用场景可以是这样的:有一天,你搞了一场投资开始炒股,这时你就会想,我怎样才能获得最大的利润呢,最简单的想法就是我在股票的最低价时买入,然后在 ...
- 求解数组环中最大子数组和的问题(java)
//石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...
- [Jobdu] 题目1527:首尾相连数组的最大子数组和
题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...
随机推荐
- Jmeter之分布式测试
1)Jmeter 是纯java 应用,对于CPU和内存的消耗比较大,并且受到JVM的一些限制: 一般情况下,依据机器配置,单机的发压量为300-600,因此,当需要模拟数以千计的并发用户时,使用单台机 ...
- 孤儿文档是怎样产生的(MongoDB orphaned document)
使用MongoDB的开发人员应该都听说过孤儿文档(orphaned document)这回事儿,可谓闻着沉默,遇者流泪.本文基于MongoDB3.0来看看怎么产生一个orphaned document ...
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
- 深入 HTML5 Web Worker 应用实践:多线程编程
深入 HTML5 Web Worker 应用实践:多线程编程 HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越 ...
- 标准IO:常用函数集合
stdio : 标准IO (1) 流(stream)和文件(file) 流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为 ...
- nodejs-ORM 操作数据库中间件waterline的使用
waterline和Sails.js同一团队开发,支持几乎所有的主流数据库,是nodejs下一款非常强大的orm,可以显著提升开发效率 一.waterline支持的数据库 二.waterline的配置 ...
- nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
官网:http://www.roxyfileman.com/ 中文包:zh.json 1.将zh.json包拷贝到Nop.Admin项目中"Content\Roxy_Fileman\lang ...
- [信息安全] 3.HTTPS工作流程
[信息安全]系列博客:http://www.cnblogs.com/linianhui/category/985957.html 0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具,包括(对 ...
- Java类加载机制、类加载器和反射机制-思维导图
参考文献: 1. <深入理解JVM虚拟机>
- ES6对象扩展
前面的话 随着JS应用复杂度的不断增加,开发者在程序中使用对象的数量也在持续增长,因此对象使用效率的提升就变得至关重要.ES6通过多种方式来加强对象的使用,通过简单的语法扩展,提供更多操作对象及与对象 ...