• 最大子序和 --动态规划


    前面写了一些算法题,但是写到后面,发现不怎么系统起来,所以从这一篇开始,我们先着重介绍一下动态规划算法!

    我们以题目开门见山.

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

    示例:

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

    解法一:动态规划思想

    思路

    • 首先对数组进行遍历,当前最大连续子序列和为sum,结果为results
    • 如果sum > 0,则说明sum对结果有增益效果,则sum保留并加上当前遍历数字
    • 如果sum <= 0,则说明sum对结果无增益效果,需要舍弃,则sum直接更新为当前遍历数字
    • 每次比较sum 和 results的大小,将最大值置为results,遍历结束后返回结果results
    • 时间复杂度为O(n)

    代码swift

    func maxSubArray(_ nums: [Int]) -> Int {
        var results: Int = nums[0]
        var sum = 0
        for i in 0..<nums.count {
            if sum > 0 {
                sum = sum + nums[i]
            } else {
                sum = nums[i]
            }
            results = sum > results ? sum : results
        }
        return results
    }

    运行结果如下:

    解法二:动态规划思想

    思路

    动态规划,用dp[i]表示以i结尾的最大子序列和。初始化值dp[0] = nums[0],然后从第二个数开始遍历

    • 如果当前数加上前一个最大序列和大于当前数,则将当前数加到序列和中,nums[i] + dp[i - 1] > nums[i],则dp[i] = nums[i] + dp[i - 1];
    • 反之以当前数结尾的最大序列和即为dp[i] = nums[i -1]

     然后判断以当前结尾的最大序列和是否大于最大序列和。

    时间复杂度为O(n)

    空间复杂度为O(n)

    代码

    func maxSubArray(_ nums: [Int]) -> Int {
        guard nums.count > 0 else {return -1}
        var results: Int = nums[0]
        var dp = [Int]()
        dp.append(nums[0])
        for i in 1..<nums.count {
            if nums[i] + dp[i - 1] >= nums[i] {
                dp.append(nums[i] + dp[i - 1])
            } else {
                dp.append(nums[i])
            }
            if dp[i] > results {
                results = dp[i]
            }
        }
        return results
    }

    记住swift中不能直接用“=”赋值,用append增加元素

    以上就是动态规划的思想和代码,大家可以写下,希望对大家有所帮助!!!当讲到分治思想,再会增加分治思想解决问题!

  • 相关阅读:
    July 22nd 2017 Week 29th Saturday
    July 21st 2017 Week 29th Friday
    社交类APP原型模板分享——QQ
    专访UI中国认证设计师卤大湿 | 一位UI大师关于UI设计的思考
    第十届Mockplus ▪ UXPA用户体验西南赛区决赛成功举行
    【附案例】UI交互设计不会做?设计大神带你开启动效灵感之路
    旅游类APP原型模板分享——爱彼迎
    有了这款自动标注/切图神器,攻城狮终于可以省心了
    设计师升职加薪必须知道的10个设计网站
    官网类原型模板分享——Apple
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11794415.html
Copyright © 2020-2023  润新知