1. 题目描述

https://leetcode-cn.com/problems/rotate-function/
给定一个长度为 $n$ 的整数数组 $nums$ 。
假设 $arr_k$ 是数组 $nums$ 顺时针旋转 $k$ 个位置后的数组,我们定义 nums 的 旋转函数 F 为:

  • F(k) = 0 arrk[0] + 1 arrk[1] + … + (n - 1) * arrk[n - 1]

返回 F(0), F(1), …, F(n-1)中的最大值 。
生成的测试用例让答案符合 32 位 整数。
示例 1:
输入: nums = [4,3,2,6]
输出: 26
解释: F(0) = (0 4) + (1 3) + (2 2) + (3 6) = 0 + 3 + 4 + 18 = 25 F(1) = (0 6) + (1 4) + (2 3) + (3 2) = 0 + 4 + 6 + 6 = 16 F(2) = (0 2) + (1 6) + (2 4) + (3 3) = 0 + 6 + 8 + 9 = 23 F(3) = (0 3) + (1 2) + (2 6) + (3 4) = 0 + 2 + 12 + 12 = 26 所以 F(0), F(1), F(2), F(3) 中的最大值是 F(3) = 26 。
示例 2:
输入: nums = [100]
输出: 0
提示:

  • $n == nums.length$
  • $1 <= n <= 10^5$
  • $-100 <= nums[i] <= 100$

    2. 题解

    2022-04-22 AC, 暴力的解法会超时, 这里需要算出一个递推公式
    F{k+1}-F{k} = a{n-k} + a{n-k+1} +…+ a{n-k-3}+ a{n-k-2}-a{n-k-1}=sum(A)-n*a{n-k-1} ```php <?php /**
    • Created by PhpStorm
    • User: jtahstu
    • Time: 2022/4/22 10:20
    • Des: 396. 旋转函数
    • https://leetcode-cn.com/problems/rotate-function/
    • 给定一个长度为 n 的整数数组 nums 。
    • 假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:
    • F(k) = 0 arrk[0] + 1 arrk[1] + … + (n - 1) * arrk[n - 1]
    • 返回 F(0), F(1), …, F(n-1)中的最大值 。
    • 生成的测试用例让答案符合 32 位 整数。 */

class Solution {

  1. /**
  2. * @param Integer[] $nums
  3. * @return Integer
  4. * F_{k+1}-F_{k} = a_{n-k} + a_{n-k+1} +...+ a_{n-k-3}+ a_{n-k-2}-a_{n-k-1}=sum(A)-n*a_{n-k-1}
  5. */
  6. function maxRotateFunction($nums)
  7. {
  8. $count = count($nums);
  9. $sum = array_sum($nums);
  10. $f = 0;
  11. for ($i = 0; $i < $count; $i++) {
  12. $f += $i * $nums[$i];
  13. }
  14. $max = $f;
  15. for ($i = 0; $i < $count; $i++) {
  16. $f = $f + $sum - $count * $nums[$count - $i - 1];
  17. $max = max($max, $f);
  18. }
  19. return $max;
  20. }
  21. /**
  22. * 常规写法会超时
  23. * @param Integer[] $nums
  24. * @return Integer
  25. */
  26. function maxRotateFunction超时($nums)
  27. {
  28. if (count($nums) == 0) {
  29. return 0;
  30. }
  31. $count = count($nums);
  32. $max = PHP_INT_MIN;
  33. for ($i = 0; $i < $count; $i++) {
  34. $index = $res = 0;
  35. for ($j = $i; $j < $count; $j++) {
  36. $res += $index * $nums[$j];
  37. $index++;
  38. }
  39. for ($j = 0; $j < $i; $j++) {
  40. $res += $index * $nums[$j];
  41. $index++;
  42. }
  43. $max = max($max, $res);

// echo “$res “; } // echo PHP_EOL; return $max; } }

var_dump((new Solution())->maxRotateFunction([4, 3, 2, 6])); var_dump((new Solution())->maxRotateFunction([100]));

/**

  • 执行用时:288 ms, 在所有 PHP 提交中击败了100.00%的用户
  • 内存消耗:31 MB, 在所有 PHP 提交中击败了100.00%的用户
  • 通过测试用例:58 / 58 */ ```