C语言重构【1191】K 次串联后最大子数组之和

约定不等于承诺〃 2022-11-06 15:00 540阅读 0赞

文章目录

        • 所有题目源代码:[Git地址](https://github.com/ch98road/leetcode)
        • 题目
        • 方案:
          • 复杂度计算

所有题目源代码:Git地址

题目

  1. 给你一个整数数组 arr 和一个整数 k
  2. 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。
  3. 举个例子,如果 arr = [1, 2] k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。
  4. 然后,请你返回修改后的数组中的最大的子数组之和。
  5. 注意,子数组长度可以是 0,在这种情况下它的总和也是 0
  6. 由于 结果可能会很大,所以需要 模(mod 10^9 + 7 后再返回。
  7. 示例 1
  8. 输入:arr = [1,2], k = 3
  9. 输出:9
  10. 示例 2
  11. 输入:arr = [1,-2,1], k = 5
  12. 输出:2
  13. 示例 3
  14. 输入:arr = [-1,-2], k = 7
  15. 输出:0
  16. 提示:
  17. 1 <= arr.length <= 10^5
  18. 1 <= k <= 10^5
  19. -10^4 <= arr[i] <= 10^4

方案:

  1. class Solution
  2. {
  3. public:
  4. int kConcatenationMaxSum(vector<int> &arr, int k)
  5. {
  6. int len = arr.size();
  7. int res = 0, now = 0;
  8. int lastres = 0;
  9. //跑k轮
  10. for (int i = 0; i < k; i++)
  11. {
  12. lastres = res;
  13. for (int j = 0; j < len; j++)
  14. {
  15. now = (arr[j] + now) > 0 ? (arr[j] + now) : 0;
  16. if (now >= 1000000007)
  17. {
  18. now = now % (1000000007);
  19. res = now;
  20. }
  21. else
  22. res = max(now, res);
  23. }
  24. //如果一圈下来没涨,那么剩下的圈也不用跑了,不会涨
  25. if (res == lastres)
  26. break;
  27. //一圈下来涨了,当i>1的时候(说明是整圈跑下来的)那么直接加整圈即可
  28. else if (res > lastres && i > 1)
  29. {
  30. int tmp = res - lastres;
  31. for (int j = i + 1; j < k; j++)
  32. {
  33. res = (res + tmp) % (1000000007);
  34. }
  35. break;
  36. }
  37. }
  38. return res;
  39. }
  40. };
复杂度计算
  • 时间复杂度:O(n+k):看起来是两层循环,实际上,i不会超过3,也就是最多3n+k的时间复杂度
  • 空间复杂度:O(1)

发表评论

表情:
评论列表 (有 0 条评论,540人围观)

还没有评论,来说两句吧...

相关阅读

    相关 如何求出数组之和

    问题描述:一个有n个元素的数组,元素中有正有负,数组中一个或者连续多个元素可以组成一个子数组,求子数组中和最大的? 方法一:暴力法 > 三层循环,找出所有的子数组,并求