精华内容
下载资源
问答
  • class Solution { public: int maxSubArray(int A[], int n) { int sum=A[0]; int b=sum; for(int i=0;i<n;i++) { if(i>0)sum+=A[i]; ...
    class Solution {
    public:
        int maxSubArray(int A[], int n) {
            int sum=A[0];
            int b=sum;
            for(int i=0;i<n;i++)
            {
                if(i>0)sum+=A[i];
                if(sum>b)b=sum;
                if(sum<0&&i!=n-1)
                {
                    sum=0;
                }
            }
            return b;        
        }
    };
    

     

    转载于:https://www.cnblogs.com/tgkx1054/archive/2013/05/18/3085501.html

    展开全文
  • 53 maximum-subarray 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其...以nums[i]为结尾的连续子数组最大和,要么是 以nums[i-1]为结尾的连续子数组最大和+num...

    53 maximum-subarray

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

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

    思路
    以nums[i]为结尾的连续子数组的最大和,要么是 以nums[i-1]为结尾的连续子数组最大和+nums[i],要么就是nums[i]本身。
    即sum[i] = max(sum[i-1] + nums[i], nums[i])。

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            if(nums.size() == 0)
                return 0;
            int max_sum = nums[0], sum = nums[0];
            for(int i=1;i<nums.size();i++)
            {
                sum = max(sum + nums[i], nums[i]);
                max_sum = max(max_sum, sum);
            }
            return max_sum;
        }
    };
    

    分治方法
    主要的思路就是将当前数组分成两份,(start, i)(i+1, end)分别计算,并且还有一种情况就是包含了i和i+1的和,取三者最大值即可。时间复杂度是O(NlogN)。

    展开全文
  • 连续子数组最大和>>> 动态规划:dp[i]为数组中0-i个数中连续数组子数组最大和,状态转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i]),初始值dp[0]=nums[0] package BDyNamicProgramming; /** * @Author...

    连续子数组最大和>>>
    在这里插入图片描述

    动态规划:dp[i]为数组中0-i个数中连续数组子数组最大和,状态转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i]),初始值dp[0]=nums[0]

    
    package BDyNamicProgramming;
    
    /**
     * @Author Zhou  jian
     * @Date 2020 ${month}  2020/4/21 0021  15:53
     */
    public class Problem42 {
    
        //采用前缀和
        //双层循环超出时间限制:时间复杂度为O(N^2)
        public int maxSubArray(int[] nums) {
            if(nums.length==1) return nums[0];
            int[] sum = new int[nums.length+1];
            int maxSum = Integer.MIN_VALUE;
            sum[0]=0;
            //求的前缀和
            for(int i=0;i<nums.length;i++){
                sum[i+1]=sum[i]+nums[i];
            }
    
            for(int i=0;i<nums.length+1;i++){
                for (int j=0;j<i;j++){
                    if(sum[i]-sum[j]>maxSum) maxSum=sum[i]-sum[j];
                }
            }
            return maxSum;
        }
    
    
        /**
         *
         * @param nums
         * @return
         * 动态规划:
         *          状态定义:设动态规划列表dp,dp[i]代表以元素nums[i]为结尾的连续数组最大和
         *                  为何定义最大和dp[i]中必须包含元素nums[i]:保证dp[i]递推到dp[i+1]的正确性
         *
         *           转移方程:若dp[i-1]<=0说明dp[i-1]对dp[i]产生负贡献,即dp[i-1]+nums[i]还不如nums[i]本身大
         *
         *                     dp[i-1]>0时:执行dp[i]=dp[i-1]+nums[i]
         *                     dp[i-1]<=0时:执行dp[i]=nums[i]
         *
         *          初始状态:dp[0]= nums[0] 即以nums[0]结尾的连续子数组最大和为nums[0]
         *
         *          返回值:返回dp列表中的最大值,代表全局最大值
         */
    
        //空间复杂度降低:由于dp[i]只与dp[i-1]和nums[i]有关系,因此
        //可以将原数组nums用作dp列表,即直接在nums上修改即可
        //由于省去dp列表使用额外的空间因此空间复杂度从O(N)到O(10
        public int maxSubArray1(int[] nums){
    
            int[] dp = new int[nums.length];
    
            dp[0]=nums[0];
            int max = dp[0];
            for(int i=1;i<nums.length;i++){
    
                //根据前一个的dp值确定当前位置的dp
                if(dp[i-1]<=0) dp[i]=nums[i];
                else dp[i]=dp[i-1]+nums[i];
    
                if(dp[i]>max) max=dp[i];
            }
            return max;
        }
    
    
    
    
        public static void main(String[] args) {
    
        }
    
    
    
    
    
    
    }
    
    
    
    展开全文
  • 题目: 给你一个整数数组 nums ,请你找出数组中乘积最大连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:...

    题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
    示例 1:
    输入: [2,3,-2,4]
    输出: 6
    解释: 子数组 [2,3] 有最大乘积 6。

    示例 2:
    输入: [-2,0,-1]
    输出: 0
    解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
    思路:
    求乘积的最大值,示例中告诉我们,由于负数的出现,一个正数乘以负数就变成了负数,即:最大值乘以负数就变成了最小值;同理,最小值乘以负数,也可能变成最大值。最大值或者最小值乘以0,也都变成了0
    因此,我们用两个动态规划数组,f[i]用来保存截止到i,连续子数组的最大乘积;g[i]用来保存截止到j,连续子数组的最小乘积。
    f[i]=max(nums[i]*f[i-1],nums[i],nums[i]*g[i-1])
    g[i]=min(nums[i]*f[i-1],nums[i],nums[i]*g[i-1])

    python解法:

    class Solution:
        def maxProduct(self, nums: List[int]) -> int:
            if not nums:return 0
            N=len(nums)
            f=[0]*N 
            g=[0]*N 
            f[0]=g[0]=res=nums[0]
            for i in range(1,N):
                f[i]=max(f[i-1]*nums[i],nums[i],g[i-1]*nums[i])
                g[i]=min(f[i-1]*nums[i],nums[i],g[i-1]*nums[i])
                res=max(res,f[i])
            return res
    

    java解法:

    class Solution {
        public int maxProduct(int[] nums) {
            if (nums ==null || nums.length==0)  return 0;
            int res=nums[0];
            int pre_max=nums[0];
            int pre_min=nums[0];
            for (int i=1;i<nums.length;i++){
                int cur_max=Math.max(Math.max(pre_max*nums[i],pre_min*nums[i]),nums[i]);
                int cur_min=Math.min(Math.min(pre_max*nums[i],pre_min*nums[i]),nums[i]);
                res=Math.max(res,cur_max);
                pre_max=cur_max;
                pre_min=cur_min;
            }
            return res;
        }
    }
    
    展开全文
  • 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示: 1 <= arr.length <= 10^5 -100 <= arr[i] <= 100 思路: 遍历数组,因为当一个负数加上任意数,都会比这个数本身小。 所以可以从nums
  • 题目来源:力扣 题目描述: 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。...解释: 连续子数组 [4,-1,2,1] 的和最...
  • 连续子数组最大和 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 class Solution { public: int maxSubArray(vector...
  • 问题描述: 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一...解释:连续子数组[4,-1,2,1] 的和最大,为6。 算法分析: 本题可以使用动态规划解决。动态规划方法也可以认为是填表法...
  • 题目:连续子数组最大和 /* 思路:假设现在遍历到下标为K的数,这时我们需要比较 K数是否比 K之前数的和+K数 大,如果是 则说明K之前数的和肯定是负数,那么我们下次就从K下标开始算起 , 如果不是 那么就继续加...
  • 连续子数组最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,...
  • 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 题目要求时间复杂度O(N),不能暴力。 可以考虑,记录前面的和,如果前一个和 <0 ,则直接抛弃它,使用自己的进行记录。每一次看这个和与最大值比较,取最大值。 ...
  • (1) dp[i]:以第i项结束的最大和,答案是dp[i]中的最大值,所以要求两次最值!!! (2) dp[i] = max(dp[i-1] + nums[i], nums[i]); dp[i-1] < 0时,dp[i] = nums[i]; dp[i-1] > 0时,dp[i] = dp[i-1] + nums[i]...
  • //记录包括当前数为结尾的连续子数组最大值 int imin = nums[0]; //记录包括当前数为结尾的连续子数组的最小值 for(int i = 1; i ; i++){ if(nums[i] ){ int tmp = imax; imax = imin; imin = tmp; } ...
  • Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. Example: Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 ...
  • LeetCode-连续子数组最大

    千次阅读 2017-03-10 14:41:36
    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]...
  • 当输出或比较的结果在原数据结构中是连续排列的时候,可以使用滑动窗口算法求解。 最大相同子串 题目描述:获取两个字符串中最大相同子串。 举例: String str1 = “abcwerthello1yuiodefabcdef”; String str2 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,634
精华内容 1,053
关键字:

leetcode最大连续子数组