本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接
题目描述
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例:
输入:[1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-average-subarray-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码
思路分析
- 这个题目描述简单易懂,解决也比较容易。可以采用滑动窗口的方法解决。
- 平均数是滑动窗口类问题中比较简单的,因为只需要判断动态和和窗口中的数字个数,即可求出平均数。在窗口大小不变的情况下,求出最大滑动窗口和即可。
AC代码
/**
* leetcode 643 子数组的最大平均数
*
*/
public class DayCode {
public static void main(String[] args) {
int[] nums = new int[]{1,12,-5,-6,50,3};
int k = 4;
double ans = new DayCode().findMaxAverage(nums, k);
System.out.println("ans is " + ans);
}
public double findMaxAverage(int[] nums, int k) {
int tempSum = 0, maxSum = 0;
for (int i = 0; i < k; i++) {
tempSum += nums[i];
}
maxSum = tempSum;
for (int j = k; j < nums.length; j++) {
tempSum -= nums[j-k];
tempSum += nums[j];
maxSum = Math.max(tempSum, maxSum);
}
return (double) maxSum / k;
}
}
复制代码
提交测试:
顺利AC!
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(1)。
- 滑动窗口类问题的思想其实并不复杂,但是在代码实现的时候,会有一些边界和细节的问题需要考虑。
- 滑动窗口的思想,还广泛应用于生产中,比如:API接口限流。
- 坚持每日一题,加油!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END