• 阿里巴巴找黄金宝箱(V)--滑动窗口


    【阿里巴巴找黄金宝箱(V)】

    一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字。
    阿里巴巴念出一个咒语数字k(k最大值,并输出该最大值。

    输入描述

    第一行输入一个数字字串,数字之间使用逗号分隔,例如: 2,10,-3,-8,40,5
    字串中数字的个数>=1,<=100000;每个数字>=-10000,<=10000;
    第二行输入咒语数字,例如:4,咒语数字大小小于宝箱的个数

    输出描述

    连续k个宝箱数字和的最大值,例如:39

    示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

    输入

    2,10,-3,-8,40,5
    4

    输出

    39

    示例2 输入输出示例仅供调试,后台判题数据一般不包含示例

    输入

    8
    1

    输出

    8

    方案1 暴力破解,时间复杂度O(n平方)

    方案2 滑动窗体   

    方案2:窗口滑动,双指针移动,时间复杂度O(n),对于固定长度k,则起点第i个长度为k的总和:
    *  Sum(i) = Sum(i-1) - list[i-1] + list[i+k];

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. #define MAX(a, b) ((a) > (b) ? (a) : (b))
    5. //方案1:暴力破解
    6. int BaoLi(int *list, int n, int k)
    7. {
    8. int sum = 0;
    9. int max;
    10. for (int i = 0; i < n - k; i++) {
    11. sum = 0;
    12. for (int j = i; j < k + i; j++) {
    13. sum += list[j];
    14. }
    15. if (i == 0) {
    16. max = sum;
    17. } else {
    18. max = MAX(max, sum);
    19. }
    20. }
    21. return max;
    22. }
    23. /*
    24. *方案2:窗口滑动,双指针移动,对于固定长度,则起点第i个长度为k的总和:
    25. * Sum(i) = Sum(i-1) - list[i-1] + list[i+k];
    26. */
    27. int DoublePoint(int *list, int n, int k)
    28. {
    29. int sum = 0;
    30. int max;
    31. int left = 0;
    32. int right = 0;
    33. while (right < n) {
    34. sum += list[right];
    35. right++;
    36. if (right - left < k) {
    37. //滑窗大小不满足咒语数字则右边界继续向右滑动
    38. continue;
    39. }
    40. if (left == 0) {
    41. max = sum;
    42. } else {
    43. max = MAX(max, sum);
    44. }
    45. // 滑窗大小已经满足咒语数字,则左边界需要右移
    46. sum = sum - list[left]; //公式:Sum(i) = Sum(i-1) - list[i-1] + list[i+k];
    47. left++;
    48. }
    49. return max;
    50. }
    51. int main()
    52. {
    53. int list[100000] = {0};
    54. char s[100001] = {0};
    55. int k;
    56. gets(s);
    57. scanf("%d", &k);
    58. char *p = strtok(s, ",");
    59. int idx = 0;
    60. while (p != NULL) {
    61. list[idx] = atoi(p);
    62. idx++;
    63. p = strtok(NULL, ",");
    64. }
    65. printf("max1=%d\n", BaoLi(list, idx, k));
    66. printf("max2=%d\n", DoublePoint(list, idx, k));
    67. return 0;
    68. }

  • 相关阅读:
    【Spring boot 返回 json 数据】
    WP Ultimate CSV Importer远程代码执行分析-CVE-2023-4142
    网页翻译软件-网页自动采集翻译软件免费
    建立HTTP代理IP池的技术和工具支持
    Matlab:变量名称
    Redis
    标准C库IO函数和Linux系统IO函数
    PHP基础学习第六篇(初识CSS)
    pyinstaller打包技巧
    SDP护航车企数智化(一)丨深挖汽车前市场 MOT
  • 原文地址:https://blog.csdn.net/weixin_41010318/article/details/132769665