您的位置:首页 > 编程语言 > Java开发

leetcode+华为笔试题-java实现返回一个整数数组中最大子数组的和

2018-03-29 10:49 531 查看


方法一:暴力枚举

定义一个最大值max初始化一个很小的数,定义一个变量sum表示求和值,遍历数组元素,从第一个元素开始,依次相加,如果和sum比最大值max大就将sum赋值给最大值。然后再来一个循环控制从第i个数组元素开始求和,直到n.

时间复杂度:O(n^2)

方式二:贪心法

因为每次求和都是将i前面的元素相加,会出现重复的情况,如果出现相加完之后是负数,说明这时我就要继续遍历找到第一个正数,将前面的和为负数的元素全部丢掉。如果找不到正数,那现在的值max就是最大值。

时间复杂度:O(n)

代码如下:

public class Demo1 {
public static void main(String[] args) {
int arr[] = { 2, -3, 4, 11, -5, 8, 3, -6 };
int maxSum = getMaxSum2(arr);
System.out.println("最大子数组的和为:" + maxSum);
}

private static int getMaxSum(int[] arr) {
int max = -100000;
for (int i = 0; i < arr.length; i++) {
int sum = 0;
for (int j = i; j < arr.length; j++) {
sum += arr[j];
if (max < sum) {
max = sum;
}
}
}

return max;
}

// 贪心法
private static int getMaxSum2(int[] arr) {
int n = arr.length;
int max = -1000000;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
if (sum > max) {
max = sum;
}
if (sum < 0) {
max = 0; // 子串和为负数,丢掉
}
}
return max;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐