题目链接
    image.png

    1. class Solution {
    2. public double findMaxAverage(int[] nums, int k) {
    3. // return findMaxAverage1(nums, k);
    4. return findMaxAverage2(nums, k);
    5. }
    6. // 1.统计和,计算k
    7. public double findMaxAverage1(int[] nums, int k) {
    8. // 1. 先统计前K项的和
    9. int num = 0;
    10. for(int i = 0; i < k; i++) {
    11. num += nums[i];
    12. }
    13. // 2.计划窗口的移动
    14. int n = num;
    15. for(int i = k; i < nums.length; i++) {
    16. n = n - nums[i-k] + nums[i];
    17. // 拿取最大值
    18. num = Math.max(n,num);
    19. }
    20. return 1.0*num / k; // 不乘1.0转化为小数,double类型的话就会有精度不正确的问题
    21. }
    22. // 2.双指针
    23. public double findMaxAverage2(int[] nums, int k) {
    24. // 1. 先统计前K项的和
    25. int len = nums.length;
    26. int num = 0;
    27. for(int i = 0; i < k; i++) {
    28. num += nums[i];
    29. }
    30. int p1 = 0;
    31. int p2 = k;
    32. int max = num;
    33. // 2.计划窗口的移动
    34. while( p2 < len) {
    35. max = max - nums[p1++] + nums[p2++];
    36. num = Math.max(num, max);
    37. }
    38. return 1.0*num / k; // 不乘1.0转化为小数,double类型的话就会有精度不正确的问题
    39. }
    40. }