- Question
- Ideas
- 1、Answer( Java )
- `⚡️Arrays 类静态方法 public static IntStream stream(int[] array)`
- `⚡️Interface IntStream 中 sum() 方法`
- Code
- Overtime Code
396. 旋转函数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-function/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Ideas 1、Answer( Java )
解法思路:数学规律 + 迭代法
⚡️Arrays 类静态方法 public static IntStream stream(int[] array)
返回顺序 IntStream
与指定的数组作为源。
⚡️Interface IntStream 中 sum() 方法
返回此流中元素的总和。
👍迭代法 比较两个相邻要计算的值,看这两个值的差 F(i)-F(i-1)
,总结成公式后从 F(0)
出发,O(1)
地计算出下一个 F
值
/**
* @author Listen 1024
* @description 396. 旋转函数(数学规律 + 迭代法)
* @date 2022-04-22 8:19
*/
/**
* 解题方法二:数学规律 + 迭代法
* 时间复杂度O(n) 其中 n 是数组 nums 的长度
* 空间复杂度O(1) 仅使用常数空间
*/
class Solution {
public int maxRotateFunction(int[] nums) {
int res = 0, len = nums.length, numsSum = Arrays.stream(nums).sum();
if (len == 0) {
return res;
}
int resSum = 0;
for (int i = 0; i < len; i++) {
resSum += i * nums[i];
}
res = resSum;
for (int i = len - 1; i > 0; i--) {
resSum += numsSum - len * nums[i];
res = Math.max(res, resSum);
}
return res;
}
}
//上述题解参考链接
https://leetcode-cn.com/problems/rotate-function/solution/xuan-zhuan-shu-zu-by-leetcode-solution-s0wd/
👍暴力解法 题目要求 数组顺时针
旋转,复制两层 nums
数组后为 copyOf
,再简单模拟
/**
* @author Listen 1024
* @description 396. 旋转函数(数学规律 + 迭代法)
* @date 2022-04-22 8:19
*/
/**
* 暴力题解超时
* 46 / 58 个通过测试用例
*/
class Solution {
public int maxRotateFunction(int[] nums) {
int res = 0, len = nums.length;
if (len == 1) {
return res;
}
int[] copyOf = Arrays.copyOf(nums, len << 1);
for (int i = len; i < len << 1; i++) {
copyOf[i] = copyOf[i - len];
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
int sum = 0, index = i, cnt = 0;
while (cnt < len) {
sum += cnt * copyOf[index];
index++;
cnt++;
}
list.add(sum);
}
res = Collections.max(list);
return res;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)