• LeetCode 396. Rotate Function


    Given an array of integers A and let n to be its length.

    Assume Bk to be an array obtained by rotating the array A k positions clock-wise, we define a "rotation function" F on A as follow:

    F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1].

    Calculate the maximum value of F(0), F(1), ..., F(n-1).

    Note:
    n is guaranteed to be less than 105.

    Example:

    A = [4, 3, 2, 6]
    
    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
    
    So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.

    【问题分析】

    这是一个关于数组旋转操作的题目,其他的关于Rotate 操作的题目如下:

     【思路】

    1. 解决这个问题的一个简单思路就是先找到Rotate点,然后把数组A划分成两部分,然后对这两部分进行有权值的求和累加。对于这个题目来说,数组A可以分成两部分:

    A[0],A[1],A[2],...,A[len-k-1],A[len-k],A[ken-k+1],...,A[len-3],A[len-2],A[len-1]

    我们可以先对后半部分累加求和,然后再对前半部分累加求和。

    2. 思路1中的方法很简单,但是时间复杂度较高,为O(N2),如何降低时间复杂度呢?一个巧妙的方法如下:

     

    上述方法把这个问题转换成了一个递推关系式子,只要计算一个F,则所有的F[k]都可以计算出来了,这样的计算过程时间复杂度为O(N)。

    【java代码】

     1 public class Solution {
     2     public int maxRotateFunction(int[] A) {
     3         if(A.length <= 1) return 0;
     4         int maxnum = Integer.MIN_VALUE;
     5         
     6         for(int i = 0; i < A.length; i++){
     7             maxnum = Math.max(maxnum, rotateFun(A, i));
     8         }
     9         return maxnum;
    10     }
    11     
    12     public int rotateFun(int A[], int k){
    13         int len = A.length;
    14         int factor = 0, sum = 0;
    15         
    16         for(int i = k; i >= 1; i--, factor++){
    17             sum = sum + A[len-i] * factor;
    18         }
    19         for(int j = 0; j < len-k; j++, factor++){
    20             sum = sum +  A[j] * factor;
    21         }
    22         return sum;
    23     }
    24 }
     1 public class Solution {
     2     public int maxRotateFunction(int[] A) {
     3         int allSum = 0;
     4         int len = A.length;
     5         int F = 0;
     6         for (int i = 0; i < len; i++) {
     7             F += i * A[i];
     8             allSum += A[i];
     9             
    10         }
    11         int max = F;
    12         for (int i = len - 1; i >= 1; i--) {
    13             F = F + allSum - len * A[i];
    14             max = Math.max(F, max);
    15             
    16         }
    17         return max;
    18     }
    19 }
  • 相关阅读:
    SpringCloud-Bus总线的其他应用场景(发布-订阅)
    Java的静态代理和动态代理
    为什么重写equals还要重写hashcode?(转载)
    js通过replace()方法配合正则去除空格
    2016-08-15T16:00:00.000Z 格式转换成yyyy-MM-dd HH:mm:ss格式
    js任意数组按下标相加
    学习笔记《Java多线程编程实战指南》四
    学习笔记《Java多线程编程实战指南》三
    学习笔记《Java多线程编程实战指南》二
    学习笔记《Java多线程编程实战指南》一
  • 原文地址:https://www.cnblogs.com/liujinhong/p/5887670.html
Copyright © 2020-2023  润新知