Leetcode 643.子数组最大平均数I

子数组最大平均数I

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

示例 1:

输入: [1,12,-5,-6,50,3], k = 4

输出: 12.75

解释: 最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

注意:

  1. 1 <= k <= n <= 30,000。
  2. 所给数据范围 [-10,000,10,000]。

思路

本题拿到手的时候,第一个思路就是对每一个元素都去求其长度为k的连续子数组的平均数,最后比较返回最大平均数,这样的算法时间复杂度~n*k,当k接近n时,时间复杂度~n平方,所以放弃这种算法。

我们初始化一个sum变量保存元素之和(初始化为0),一个maxAvg保存最大的平均数(初始化为Double下的负数最小值),这里需要强调一下, Double.NEGATIVE_INFINITY 表示负无穷,Double.MIN_VALUE 表示的是64位双精度值能表示的最小正数。然后开始遍历数组元素,每一步首先都将sum更新,然后判断当前索引是否大于等于k - 1,当等于k - 1时,对当前sum求平均,与maxAvg比较,当大于k - 1时,需要减去nums[i - k],这样就实现了动态更新sum,当小于k - 1时,继续循环。最后返回maxAvg即可。

 1 public class Solution {
 2     public double findMaxAverage(int[] nums, int k) {
 3         /**
 4          * Double.NEGATIVE_INFINITY 表示负无穷
 5          * Double.MIN_VALUE 表示的是64位双精度值能表示的最小正数
 6          */
 7         double maxAvg = Double.NEGATIVE_INFINITY;
 8         double sum = 0.0;
 9         for (int i = 0; i < nums.length; i++) {
10             sum += nums[i];
11             if (i >= k - 1) {
12                 if (i > k - 1) {
13                     sum = sum - nums[i - k];
14                 }
15                 if (sum / k > maxAvg) maxAvg = sum / k;
16             }
17         }
18         return maxAvg;
19     }
20 }

原文地址:https://www.cnblogs.com/kexinxin/p/10383057.html

时间: 2024-07-31 05:35:55

Leetcode 643.子数组最大平均数I的相关文章

LeetCode 907 子数组的最小值之和

给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组.由于答案可能很大,因此返回答案模 10^9 + 7. 示例: 输入:[3,1,2,4] 输出:17 解释: 子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]. 最小值为 3,1,2,4,1,1,2,1,1,1,和为 17. 提示: 1 <= A <= 30000 1 <= A[i] <= 30000 原文地址

[LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead. Example: Input: s = 7, nums = [2,3,1,2,4,3] Output: 2 Explanation: the subarr

[LeetCode]560. 和为K的子数组(前缀和)

题目 给定一个整数数组和一个整数?k,你需要找到该数组中和为?k?的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 说明 : 数组的长度为 [1, 20,000]. 数组中元素的范围是 [-1000, 1000] ,且整数?k?的范围是?[-1e7, 1e7]. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subarray-sum-eq

【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大

Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 

在一个数组中找到连续的子数组最大的乘积

原题目:https://oj.leetcode.com/problems/maximum-product-subarray/ 例如输入[2,3,-2,4]? 符合条件的子数组应该是[2,3],他们的乘积是6 /** * @Author jiangfq * */ package com.test; /** * @author jiangfq * */ public class Solution { /** * @Author jiangfq * */ public static void main

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

需要排序的最短子数组的长度 貌似在leetcode上遇到过,就是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组. from:https://blog.csdn.net/behboyhiex/article/details/80758686 [题目] 给定一个无序数组arr,求出需要排序的最短子数组长度. 例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序. [思路] 双指针 第一次从左向右遍历,找左边比当前位置大的 第

求解最大连续子数组和问题

前言 最近工作不是特别忙,所以有更多时间来学习算法相关知识,补短处.题目来源于leetcode,通过一个算法题,我们去分析该算法题所属类型,以及解题思路,以及该算法题所用到的数学知识.选择的算法题目从容易到困难,逐步提高难度,解题的思路也是从简单到复杂,时间复杂度也是从低到高的顺序来书写这个系列的博客.因工作语言和使用熟练度原因算法采用Java编写,但该系列中可能会穿插c.C++.python语言实现,请不要奇怪. 题目 分析题目:给定的整型数组,求解最大连续子数组和,要求是至少包含一个元素,且

最大连续子数组和算法(动态规划解释)

之前在其他博客看到了,但是算法的关键部分完全看不懂为什么要这么做,直到最近上算法课,才终于知道到底怎么来的. 问题描述: 给出一个数组,求其最大连续子数组和 例:数组{1,2,3,4,-5,10,-1,-1}的最大连续子数组和是子数组{1,2,3,4,-5,10}的和15 算法过程: 这个算法能从零直接想出来的人是真的厉害,我并不可以,所以我直接描述一下这个算法是怎么算的,而不描述怎么想到的了 首先我们把原来数组记做a,然后最关键的一步,我们需要一个等长的数组b,b[j]的含义是以下一系列和中的

连续子数组中最大和

1:题目描述 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 提示: 1 <= arr.length <= 10^5-100 <= arr[i] <= 100注意:本题与主站 53 题相同:https://leetcode-cn.com/prob