leetcode每日一题 396. 旋转函数

leetcode每日一题 396. 旋转函数

1.暴力破解 超时
class Solution {
  public int maxRotateFunction(int[] nums) {
      if(nums.length == 1){
          return 0;
      }
      int max = Integer.MIN_VALUE;
      for (int i = 0; i < nums.length; i++) {
          int sum = 0 ;
          for (int j = 0; j < nums.length; j++) {
              sum+= (i+j)%nums.length*nums[j];
          }
          max = Math.max(sum,max);
      }
      return max;
  }
}
2.转公式 F(k) = f(k-1) + sum - n*nums[n-k] n=nums.length   

class Solution {
  public int maxRotateFunction(int[] nums) {
      int max;
      int sum = Arrays.stream(nums).sum();
      //f(0)
      int f = 0;
      for (int i = 0; i < nums.length; i++) {
          f += i*nums[i];
      }
      max = f;
      //f(k) = f(k-1)+sum-n*nums[n-k]
      for (int i = 1; i < nums.length; i++) {
          f += sum - nums.length * nums[nums.length - i];
          max = Math.max(max,f);
      }
      return max;
  }
}

 

3.执行击败7%的原因是用了java8来写,普通for循环求和可以击败100%

class Solution {
  public int maxRotateFunction(int[] nums) {
      int max;
      int sum = 0;
      //f(0)
      int f = 0;
      for (int i = 0; i < nums.length; i++) {
          sum += nums[i];
          f += i*nums[i];
      }
      max = f;
      //f(k) = f(k-1)+sum-n*nums[n-k]
      for (int i = 1; i < nums.length; i++) {
          f += sum - nums.length * nums[nums.length - i];
          max = Math.max(max,f);
      }
      return max;
  }
}

 

 

posted @ 2022-04-22 09:56  java架构师1  阅读(30)  评论(0)    收藏  举报