leetcode[Maximum Average Subarray I]

来源:互联网 发布:landsat的波段数据 编辑:程序博客网 时间:2024/05/27 20:51

解法一:

class Solution {    public double findMaxAverage(int[] nums, int k) {        //int maxSum = Integer.MIN_VALUE; 求和的不能用与数组无关的数来赋初值    //题目中提到数组长度大于等于1    //int maxSum = nums[0];//不能用这个来判断,因为maxSum的长度一定来自于k个数        //因为1 <= k <= n <= 30,000. k <= n    int maxSum = 0;    for(int i = 0; i < k; i++){    maxSum += nums[i];    }        int thisSum = 0;        //上面做过一次了,这里就从第二组的k个数开始        for(int i = 1; i <= nums.length - k; i++){//注意判断条件是i <= nums.length - k 而不是i < nums.length - k,举个例子来判断即可        thisSum = 0;        for(int j = 0; j < k; j++){        thisSum += nums[j + i];        }                maxSum = Math.max(maxSum, thisSum);        }                return (double)(maxSum) / k;    }}

解法二:

class Solution {    public double findMaxAverage(int[] nums, int k) {        long sum = 0;        for (int i = 0; i < k; i++)//先求出第一组的k个数的和        sum += nums[i];                long max = sum;//当前最大值                //这里用一个循环就可以搞定,用到slide window的思想,即使用两重循环,在往后移动时,中间的数也没变,变的只是首尾的数        for (int i = k; i < nums.length; i++) {        //所以只用对往后移动时首尾的改变一下,来个差值,就得到了第i组的k个数,i = 1,2,...k-i+1        //比如,第一组是0到k-1,那么第二组就是1到k,对nums[k] - nums[0]就得到了新的sum,第二组的,相当于遍历求和        //第三组又是在第二组的基础上,首尾又不同,是正确的,因为第二组就相当于是遍历求和来的,不存在没加上啥的            sum += nums[i] - nums[i - k];            max = Math.max(max, sum);        }                return max / 1.0 / k;    }}


原创粉丝点击