zoukankan      html  css  js  c++  java
  • leetcode53之最大子序和

    题目描述:

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

    示例:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-subarray

    代码实现

    def maxSubArray(nums):
        '''
        找出和最大的连续子数组,返回和,动态规划策略
        :param nums:
        :return:
        '''
        pre = 0  # 表示当前元素结尾的子数组之和
        tmp_res = []  # 存放当前元素结尾的子数组之和
        for num in nums:
            pre = max(pre + num, num)
            tmp_res.append(pre)
    
        return max(tmp_res)
    
    
    print("----------测试maxSubArray()----------")
    nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
    res = maxSubArray(nums)
    print("res=", res)
    
    
    def maxSubArray1(nums):
        '''
        找出和最大的连续子数组,返回和,动态规划策略
        :param nums:
        :return:
        '''
        pre = 0  # 表示当前元素结尾的子数组之和
        # tmp_res = []  # 存放当前元素结尾的子数组之和
        maxAns = float('-inf')  # 表示子数组最大值
        for num in nums:
            pre = max(pre + num, num)
            maxAns = max(maxAns, pre)
            # tmp_res.append(pre)
    
        return maxAns
    
    
    print("----------测试maxSubArray1()----------")
    nums = [-1]
    res = maxSubArray1(nums)
    print("res=", res)

    总结:这是一道数组与动态规划相结合的题目,但解题思路还是以动态规划为主。主要思想即是求出以当前元素结尾的子数组之和cur_sum,如果cur_num>0,则对增加下一个元素结尾之和有意义;反之无意义。方法1将各元素结尾之和存入arr,最后求arr最大值即可。方法2与1殊途同归,思想相同,只不过在实现上减少了空间复杂度到O(1),方法1空间复杂度为O(n)

  • 相关阅读:
    总结Linq或者lamdba的写法
    JObject 用法 、JProperty 用法、JArray 用法 Linq 转 Json
    System.DateTime.Now 24小时制。
    将springboot jar应用打包成镜像并在docker运行成容器
    RPC框架——简单高效hessian的使用方式
    WebService—规范介绍和几种实现WebService的框架介绍
    Java三大体系JavaEE、JavaSE、JavaME的区别
    JavaEE体系架构
    JavaEE 技术体系
    注解之@CookieValue
  • 原文地址:https://www.cnblogs.com/rounie/p/13353347.html
Copyright © 2011-2022 走看看