欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-24 17:24:02
...

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

方法一:暴力枚举
定义一个最大值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;
    }

}