美文网首页
Leetcode53-求子数组最大和

Leetcode53-求子数组最大和

作者: 西5d | 来源:发表于2018-03-25 15:57 被阅读16次

这是一个比较经典的题目,一般最简单的想法是列举所有的可能情况,再做统计,也是最笨拙的方法。按题目要求来说一个数组。比如ax = {a1,a2,a3,a4....an},其中{a1},{a2},{a3}...{a1,a2}...{a1,a2,a3}..等等都是子数组,这种情况合计有(n+1)*n/2种 (复杂度n^2), 每个子数组还要计算和,则算法的复杂度是n^3。根据运行结果,含1000个元素的数组,需要执行大概330-500毫秒。
但是这个题目有实现O(n)复杂度的解法,即使用贪心法,求最优解。思路是当找到的数组最大和小于0,则重置为0继续,这块需要加深理解。
以下是两种不同复杂度的解法代码:

/**
 * Created by igoso on 18-3-22.
 Find the contiguous sub array within an array (containing at least one number) which has the largest sum.
 For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
 the contiguous sub array [4,-1,2,1] has the largest sum = 6.
 求最大的子数组元素的和,实现n^3的解法,通过199/202的case,无法通过,1000个元素需要330+ms;
 实现O(n)的解法,通过,1000个元素需要0.3+ms,俗称的贪心法处理,比较惊艳;
 */
public class Leet53 {
    public static void main(String[] args) {
//        int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        //4,-1,2,1
        int[] arr = new int[1000];
        Random r = new Random(1000);
        for (int i = 0; i < 1000; i++) {
            arr[i] = -r.nextInt(1000) + r.nextInt(1000);
        }
        long start = System.nanoTime();
        System.out.println(start);
        System.out.println(maxSubArray2(arr));
        System.out.println("end" + (System.nanoTime() - start));
    }

    //O(n^3)
    public static int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0) {
            return Integer.MIN_VALUE;
        }

        if (nums.length == 1) {
            return nums[0];
        }

        double max = nums[0];
        double sum = 0;
        int step = 1;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length; j++) {
                for (int k = j; k < step + j && k < nums.length; k++) {
                    sum += nums[k];
                }
                max = (sum > max) ? sum : max;
                sum = 0;
            }
            step++;
        }

        if (max > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }

        if (max < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }

        return (int) max;
    }

    //O(n)
    public static int maxSubArray2(int[] nums) {
        if (nums == null || nums.length == 0) {
            return Integer.MIN_VALUE;
        }

        int max = Integer.MIN_VALUE;
        int sum = 0;

        //如果和为负数,则省略继续
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (sum > max) {
                max = sum;
            }
            if (sum < 0) {
                sum = 0;
            }
        }

        return max;
    }
}

相关文章

  • Leetcode53-求子数组最大和

    这是一个比较经典的题目,一般最简单的想法是列举所有的可能情况,再做统计,也是最笨拙的方法。按题目要求来说一个数组。...

  • 求子数组的最大和

    /*求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每...

  • 算法-数组(三)

    最小的k个数 求子数组的最大和 把数组排成最小的数字 1.最小的k个数 问题描述:输入n个数字,找到数组中最小的k...

  • 动态规划

    1子序列的最大和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最...

  • 01 - 复杂度 1 最大子列和问题 (20 分)

    // 在线方法求子项的最大和int maxSub(int a[],int N){int maxSum,thisS...

  • 【微软面试一百题:3】求子数组的最大和

    题目:输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 ...

  • 求子数组的最大和(微软面试100题003)

    题目: 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求...

  • 动态求子列的最大和

    在一个数组中找出和最大的连续几个数。(至少包含一个数) 例如: 数组A[] = [−2, 1, −3, 4, −1...

  • 53. 最大子序和

    题目链接: 53. 最大子序和 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最...

  • 2022-02-26最大子数组的和

    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组...

网友评论

      本文标题:Leetcode53-求子数组最大和

      本文链接:https://www.haomeiwen.com/subject/yrohcftx.html