好久没有刷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的最大子数组的平均数的更多相关文章

  1. 数组中累加和为k的最大子数组的长度

    package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...

  2. 【LeetCode】974. 和可被 K 整除的子数组

    974. 和可被 K 整除的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例 输入:A = [4,5,0,-2,-3, ...

  3. 【LeetCode】862. 和至少为 K 的最短子数组

    862. 和至少为 K 的最短子数组 知识点:单调:队列:前缀和 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 ...

  4. 数组中累加和小于等于k的最长子数组

    问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...

  5. 643. Maximum Average Subarray I 最大子数组的平均值

    [抄题]: Given an array consisting of n integers, find the contiguous subarray of given length k that h ...

  6. JavaScript Array返回值以及是否改变原数组。

    1.        push:最后一位新增://改变原数组         arr.push("123");         返回值是数组的长度:         var b =  ...

  7. CLRS最大子数组问题

    今天我们一起来看一下关于最大子数组的一些问题.最大子数组的应用场景可以是这样的:有一天,你搞了一场投资开始炒股,这时你就会想,我怎样才能获得最大的利润呢,最简单的想法就是我在股票的最低价时买入,然后在 ...

  8. 求解数组环中最大子数组和的问题(java)

    //石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...

  9. [Jobdu] 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

随机推荐

  1. ASP.NET Core Web API 最小化项目

    ASP.NET Core中默认的ASP.NET Core 模板中有Web API 模板可以创建Web API项目. 有时,只需要创建一个API,不需要关心Razor,本地化或XML序列化.通过删除无用 ...

  2. Java IO学习笔记(五)对象流

    1.Object流:直接将Object写入或读出. 2.序列化:将Object直接转化成字节流写到硬盘或网络上. 3.如果想把一个对象转化成字节流,该对象的实体类必须得实现Serializable接口 ...

  3. JanaScript预解析

    JS预解析是什么?      在当前的作用域下,js运行之前.会有带有 var 和 function关键字的代码事先声明,      并在内存中安排好,然后从上到下的执行js代码. JS预解析 js逐 ...

  4. P1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  5. java 重载与重写 【转】

    首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态 ...

  6. 细说Handler

    今天来说说Android一个重要类吧:Handler (我写的博客风格不适合新手,因为我讨厌新手教学,我都是直奔主题,不交代前因后果) 大家都知道Handler的用法一般是线程间的通讯,当然,一个线程 ...

  7. IScroll那些事——内容不足时下拉刷新

    之前项目中的列表是采用的IScroll,但是在使用IScroll有一个问题就是:当内容不足全屏的时候,是木有办法往下拉的,这样就达不到刷新的目的了.[这是本人工作中遇到的,具体例子具体分析,这里只作一 ...

  8. java基础07 多线程

    在学习操作系统时,我们会学习进程和线程,那么进程和线程又是什么东西呢? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程(thread) ...

  9. 简单好用用js就可以保存文本文件到本地

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. Ubuntu上安装PHP环境-mysql+apache+php-Linux操作系统

    安装MYSQL   1. sudo apt-get install mysql-server 或者 apt-get isntall mysql-client   2. 安装过程中会提示设置密码,注意设 ...