zoukankan      html  css  js  c++  java
  • 剑指Offer 42. 连续子数组的最大和

    题干

    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

    示例1:

    输入: nums = [-2,1,-3,4,-1,2,1,-5,4]

    输出: 6

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

    提示:

    1 <= arr.length <= 10^5

    -100 <= arr[i] <= 100

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof

    思路

    ①定义dp数组

    可以定义dp数组来记录以i为开头或者以i为结尾的数组,这里选择以i为结尾的数组,因为之后状态转移方程i是根据i-1来确定的

    ②寻找状态转移方程

    如果dp[i-1]以i-1为结尾的数组累计结果是负数,那么不如从头开始一个新的累计

    如果dp[i-1]以i-1为结尾的数组累计结果是正数,那么以i结尾的则是加上当前元素值

    ③初始状态标定

    dp[0]以nums[0]号位结尾的最大值肯定是nums[0]

    ④边界条件

    如果数组只有1个数,则直接返回该数

    结果ans初始化定义为-101

    class Solution {
        public int maxSubArray(int[] nums) {
            int ans=-101;
            if(nums.length==1){
                return nums[0];
            }
            else if(nums.length>1){
                int[] dp=new int[nums.length];
                dp[0]=nums[0];
                for(int i=1;i<nums.length;i++){
                    if(dp[i-1]>0){
                        dp[i]=dp[i-1]+nums[i];
                    }
                    else if(dp[i-1]<=0){
                        dp[i]=nums[i];
                    }
                }
                for(int x:dp){
                    if(x>ans){
                        ans=x;
                    }
                }
                return ans;
            }
            return 0;
        }
    }
  • 相关阅读:
    spring和mybatis的结合
    SpringMVC
    springdata
    springboot的总结
    SpringAop代理模式笔记
    springcloud
    完全二叉树和满二叉树
    C# 读取EXCEL文件的三种经典方法
    C#加密app.config中连接字符串的代码
    c#winform 程序 App.config文件加密(SDK命令)
  • 原文地址:https://www.cnblogs.com/ak918xp/p/14200523.html
Copyright © 2011-2022 走看看