题目
解法一:动态规划
思路:
-
定义一个长度与原数组相同的数组 dp,用于存储以每个元素为结尾的连续子数组的最大和。
-
初始化 dp[0] 为原数组的第一个元素,同时将 max 设为 dp[0]。
-
从数组的第二个元素开始遍历,对于每个元素,计算以该元素为结尾的连续子数组的最大和,即 dp[i] = Math.max(dp[i-1] + array[i],array[i])。
-
在计算 dp[i] 的同时,更新 max 的值,即 max = Math.max(max,dp[i])。
-
遍历完成后,返回 max 的值,即为原数组中连续子数组的最大和。
public static int FindGreatestSumOfSubArray(int[] array) {
int[] dp = new int[array.length];
dp[0] = array[0];
int max = dp[0];
for(int i = 1;i < dp.length;i++){
dp[i] = Math.max(dp[i-1] + array[i],array[i]);
max = Math.max(max,dp[i]);
}
return max;
}
时间复杂度:O(n) 一层for循环
空间复杂度:O(n) 开辟了跟array数组长度一样的dp数组
解法二:贪心算法
思路:
- 首先,定义了一个变量sum和max,分别表示当前连续子数组的和和最大子数组的和。还定义了一个变量temp,用来记录数组中的最大值。
- 然后,通过for循环遍历整个数组。在遍历过程中,先更新temp的值,找到数组中的最大值。然后,判断当前的sum加上当前元素是否大于等于0,如果是,则将当前元素加入sum中,并更新max的值。如果不是,则将sum重置为0,重新开始计算连续子数组的和。
- 最后,返回temp和max中的较大值。如果temp大于0,则说明数组中所有元素都是正数,此时max即为最大子数组的和;如果temp小于等于0,则说明数组中至少有一个负数,此时max可能为0,因此需要返回temp。
public int FindGreatestSumOfSubArray(int[] array) {
int sum = 0,max = 0;
int temp = Integer.MIN_VALUE;
for(int i = 0;i < array.length;i++){
temp = Math.max(temp,array[i]);
if(sum + array[i] >= 0){
sum += array[i];
max = Math.max(max,sum);
}else {
sum = 0;
}
}
return temp > 0 ? max : temp;
}
时间复杂度:O(n) 一层for循环
空间复杂度:O(1)