连续天数的最高销售额
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 64 ms, 内存: 18.4 MB
/*
* 题目思路:
* 使用 Java Stream 的话,需要结合 IntStream 和一些辅助方法来实现。
* 尽管 Kadane 算法不适合完全通过 Stream API 实现,我们可以使用类似方法结合 Stream 实现。
*/
import java.util.stream.IntStream;
public class Solution {
public int maxSubArray(int[] sales) {
// 使用数组记录当前子数组和和最大子数组和
int[] result = IntStream.range(0, sales.length)
.mapToObj(i -> new int[]{sales[i], sales[i]})
.reduce(new int[]{sales[0], sales[0]}, (acc, val) -> {
// 计算当前子数组和
acc[0] = Math.max(val[0], acc[0] + val[0]);
// 更新最大子数组和
acc[1] = Math.max(acc[1], acc[0]);
return acc;
});
return result[1];
}
}
解释
方法:
题解采用了'Kadane算法',用以解决最大子数组和的问题。首先初始化最大和max_sum为负无穷,当前和cur_sum为0。遍历数组中的每个元素,将当前元素累加到cur_sum上。如果cur_sum更新后的值比max_sum大,则更新max_sum。之后,如果cur_sum小于0,将其重置为0,因为任何负的当前和都不会对找到一个更大的子数组和有帮助。这样,通过一次遍历数组,就能得到最大的子数组和。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在Kadane算法中,当当前和cur_sum小于0时,需要将其重置为0?
▷🦆
Kadane算法是否能够处理所有元素都是负数的情况?如果可以,它是如何找到最大子数组和的?
▷🦆
在Kadane算法中,如果数组中包含0或者正负相间的数,这种情况对算法的影响是什么?
▷🦆
在实现Kadane算法时,为何要初始化max_sum为负无穷大而不是0?
▷