`
frank-liu
  • 浏览: 1683044 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Maximum Subarray

 
阅读更多

问题描述:

Find the contiguous subarray 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 subarray [4,−1,2,1] has the largest sum = 6.

click to show more practice.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

原问题链接:https://leetcode.com/problems/maximum-subarray/

 

问题分析

线性时间解法 

  这个问题在之前的文章中有过详细的分析,它有一个比较时间复杂度为O(N)的高效率实现。基本思路如下,定义一个记录当前连续子串和的变量curMax。它每次去和我们需要返回的最终值max比较,去最大的值赋给max。而当判断到curMax < 0的时候,则重置curMax为0。具体的实现代码如下:

 

public class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0], curMax = 0;
        for(int i = 0; i < nums.length; i++) {
            curMax += nums[i];
            max = Math.max(curMax, max);
            if(curMax < 0) curMax = 0;
        }
        return max;
    }
}

 

分治法

 在很多地方分治法都得到广泛的应用,比如说归并排序里也是这样的思路。我们将一个问题划分成更小的问题,然后通过这些小的问题合并起来得到最终的结果。所以按照这个思路,我们可以这样来解决问题:

  针对给定的一个区段,首先将它划分成相等的两个部分。这个最大连续子串可能出现在它的左边子串里,也可能出现在它的右边子串里,也有可能是通过跨越左右两个子串的这个串。所以我们要计算出它们两个部分,去它们中间最大的那个。这部分流程概括起来如下:

  findMax(num, l, r) = max(findMax(num, l, mid), findMax(num, mid + 1, r), findMaxCrossArray(num, l, mid, r)) 。其中mid是取l, r的中间值。findMaxCrossArray则表示从中间值mid开始向两边扩展得到的那个涵盖两个子串的最大连续子串。针对这个递归的函数,它还有一个返回的条件就是l == r,这是作为递归划分的一个终止条件。

  最终得到的详细代码实现如下:

 

public class Solution {
    public int maxSubArray(int[] nums) {
        return findMax(nums, 0, nums.length - 1);
    }
    
    public int findMax(int[] num, int l, int r) {
        if(l == r) return num[l];
        int mid = (l + r) / 2;
        int left = findMax(num, l, mid);
        int right = findMax(num, mid + 1, r);
        int cross = findMaxCrossSubArray(num, l, mid, r);
        return Math.max(left, Math.max(right, cross));
    }
    
    public int findMaxCrossSubArray(int[] num, int l, int mid, int r) {
        int leftSum = num[mid], sum = 0;
        for(int i = mid; i >= l; i--) {
            sum += num[i];
            leftSum = Math.max(sum, leftSum);
        }
        int rightSum = num[mid + 1];
        sum = 0;
        for(int j = mid + 1; j <= r; j++) {
            sum += num[j];
            rightSum = Math.max(sum, rightSum);
        }
        return leftSum + rightSum;
    }
}

  这个方法的实现效率为O(NlogN)。因为这里有递归的过程,它的递归调用栈也要占用logN的空间。所以效率相对不是很高。不过这种思路值得好好的学习借鉴。

 

参考材料

Introduction to algorithms 

分享到:
评论

相关推荐

    java-leetcode题解之Maximum Subarray Sum with One Deletion.java

    java java_leetcode题解之Maximum Subarray Sum with One Deletion.java

    leetcode分类-leetcode:leetcode问题的代码

    leetcode 分类leetcode 问题分类 leetcode代码仓库,我的解题思路写在我的博客里: ...#53:Maximum Subarray 队列/集 #3:Longest Substring Without Repeating Characters 优先队列 #23:Merge k Sorted Lists

    javalruleetcode-LeetCode::lollipop:个人LeetCode习题解答仓库-多语言

    java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 ...LeetCode ...LeetCode ...Subarray 55 Jump Game 56 Merge Intervals 64 Minimum Path Sum 73

    Leetcode:Leetcode模板技巧积累

    技巧积累异或的性质: 如果a ^ b = c,则a ^ c = b求最大/最小异或值,可以考虑Trie classic problem: leetcode-421.... Maximum Subarray leetcode-992. Subarrays with K Different Integers单调双端加速度-单队列技

    java-leetcode题解之Maximum Product Subarray.java

    java java_leetcode题解之Maximum Product Subarray.java

    leetcode双人赛-LeetCode:力码

    leetcode双人赛 1. Pattern: Sliding Window,滑动窗口类型 滑动窗口类型的题目经常是用来执行数组或是链表上某个区间(窗口)上的操作。比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边...

    leetcode答案-LeetCode:Swift中的LeetCode

    leetcode 答案LeetCode LeetCode in Swift 这个Repo 用来存下我在LeetCode 解题的原始档,包含解题中遇到的错误,也...Subarray Easy #66 Plus One Easy #70 Climbing Stairs Easy #83 Remove Duplicates from Sorted L

    leetcode分类-LeetCode:力码

    Maximum Subarray Minimum Path Sum Unique Paths Unique Paths II Longest Palindromic Substring Interleaving String Triangle Distinct Subsequences Decode Ways Palindrome Partitioning II Maximal Rectangle...

    leetCode:Leetcode解决方案

    3. Maximum Subarray:Kadane's Algorithm解决最大子数组和问题。 4. Ternary Search:在有序数组中利用三分查找法寻找目标值。 总结,LeetCode是提升编程能力的理想平台,通过学习和实践,不仅可以巩固Java基础...

    LeetCode:Leetcode-解决方案

    Maximum Subarray [53]5. House Robber [198]6. Range Sum Query - Immutable [303]7. Counting Bits [338]8. Palindromic Substrings [647]9. Maximum Length of Pair Chain [646]10. Integer Break [343]11. ...

    leetcode分类-LeetCode:LeetCode在线裁判C++

    leetcode 分类 LeetCode 152/152 ToDoList -1。 delete ...Subarray 是一个东西么? 18.汉诺塔 排序堆的建立..... 推排序 相当于优先队列 19.图的算法 kruskal prim dijstria flordy 似乎都拼错了。

    lrucacheleetcode-LeetCode:CppSourceCode的LeetCode解决方案

    Maximum Subarray 70 爬楼梯 Climbing Stairs 121 买卖股票的最佳时机 Best Time to Buy and Sell Stock 122 买卖股票的最佳时机 Ⅱ Best Time to Buy and Sell StockⅡ 123 买卖股票的最佳时机 Ⅲ Best Time to Buy...

    Leetcode:我的leetcode记录

    #Leetcode我的leetcode记录## 1。从有序数组中删除重复项public static int removeDuplicates( int [] nums) { int i = 0 ; for ( int n : nums) if (i == 0 ... Maximum Subarray问题描述:定义一个整体的副本,从中寻

    gasstationleetcode-leetcode:LeetcodeOJ解决方案

    leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167.二和二 2107/03/06 15.3 总和,16.3 总和最近,18.4 总和,11.最多水的容器 2017/03/09 62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/...

    leetcode:leetcode刷题

    3. 最大子数组和(Maximum Subarray):经典的动态规划问题,可以使用Kadane's Algorithm来求解。 4. 二叉树的层次遍历(Level Order Traversal):这道题目考察了队列的应用,使用层次遍历可以逐层打印二叉树的...

    leetcode写题闪退-LeetCode:leetcodeOJ

    leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...

    gasstationleetcode-LeetCode:力码

    加油站 ...Subarray325Maximum大小子阵总和脱节IntervalsTreeMapCounter239Sliding窗口Maximum295Find中位数的距离和很少考289Game的提高321Create最大数量很少考327Count的Equals k209Minimum大小的数组

    leetcode跳跃-leetcode:leetcode解题之路

    最大子序和](./Array/maximum-subarray.md) [0041 缺失的第一个整数](./Array/first-missing-positive.md) [0042 接雨水](./Array/trapping-rain-water.md) [0048 旋转图像](./Array/rotate-image.md) Heap 堆 [0023...

    lrucacheleetcode-leetcode:leetcode

    Maximum 255. Verify Preorder Sequence in Binary Search Tree 907. Sum of Subarray Minimums 二叉搜索树 99. Recover Binary Search Tree 109. Convert Sorted List to Binary Search Tree 116. Populating Next ...

    Leetcode:此回购包含Leetcode问题的解决方案

    此外,"Leetcode-main"可能还包含了其他挑战,如“最长连续序列”(Longest Consecutive Sequence)来演示如何使用集合进行有效的状态追踪,或者“最大子数组和”(Maximum Subarray)来展示动态规划的应用。每个问题的...

Global site tag (gtag.js) - Google Analytics