zoukankan      html  css  js  c++  java
  • 【LeetCode】53.最大子序和

    最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。


    动态规划

    分析

    1.首先对数组进行遍历,当前最大连续子序列和为sum,结果为ans;
    2.如果sum > 0,则说明sum对最终结果有增益,则保留并加上当前遍历的元素;
    3.如果sum <= 0,则说明sum无增益,需舍弃,重新更新为当前遍历的元素;
    4.每次比较sum和ans的大小,将最大值置为ans,循环结束返回ans;

    class Solution {
        public int maxSubArray(int[] nums) {
            int ans = nums[0];
            int sum = 0;
            for(int num: nums) {
                if(sum > 0) {
                    sum += num;
                } else {
                    sum = num;
                }
                ans = Math.max(ans, sum);
            }
            return ans;
        }
    }
    

    分治法

    分析

    将数组一分为二,那么最大子序和出现的位置有三种情况,1.左边,2.右边,3.横跨中间。其中左右两边的情况可以递归处理,最后返回三种情况的最大值。

    class Solution {
        public int maxSubArray(int[] nums) {
            return __maxSubArray(nums, 0, nums.length - 1);
        }
        
        static int __maxSubArray(int[] nums, int start, int end){
            
            if(start == end)
                return nums[start];
            
            if(start > end)
            	return Integer.MIN_VALUE;
    
            int mid = (start + end) / 2;
            //递归计算左半边最大子序和
            int max_left = __maxSubArray(nums, start, mid - 1);
            //递归计算右半边最大子序和
            int max_right = __maxSubArray(nums, mid + 1, end);
            
            //计算中间最大子序和
            int max_mid = nums[mid];
            int sum = nums[mid];
            for(int i = mid - 1; i >= start; i--){
                sum += nums[i];
                max_mid = Math.max(sum, max_mid);
            }
            sum = max_mid;
            for(int i = mid + 1; i <= end; i++){
                sum += nums[i];
                max_mid = Math.max(sum, max_mid);
            }
            
            //返回三种情况中的最大值
            return Math.max(Math.max(max_left, max_right), max_mid);
        }
    }
    
  • 相关阅读:
    02 基本介绍
    01 概述 网络分层
    04 可扩展
    Java 注解2
    03 高可用
    重拾安卓_00_资源帖
    JavaUtil_09_通用工具类-01_Hutool
    java支付宝开发-01-沙箱环境接入
    java支付宝开发-00-资源帖
    svn_学习_01_TortoiseSVN使用教程
  • 原文地址:https://www.cnblogs.com/huowuyan/p/11176147.html
Copyright © 2011-2022 走看看