zoukankan      html  css  js  c++  java
  • 53. Maximum Subarray

    一、题目

      1、审题

      2、分析:

        给出一个整形数组(可能全是负数),求连续的子数组的最大的和。

    二、解答

      1、思路:

        方法一、动态规划

          令 maxNum 代表最大和,tmpMaxNum 代表临时最大和。

          当向后扫描时,对第 j 个元素有两种选择,要么放入前面的子数组,要么作为新数组的第一个元素;

          如果 tmpMaxNum > 0, 则令 tmpMaxNum 加上 a[j]; 如果 tmpMaxNum < 0,则 tmpMaxNum = a[j];

          每次扫描,比较 maxNum 与 tmpMaxNum 值, 若 tmpMaxNum > maxNum , 则 maxNum = tmpMaxNum。

    public int maxSubArray(int[] nums) {
         
             int maxNum = nums[0];
             int tmpMaxNum = nums[0];
             
             for (int i = 1; i < nums.length; i++) {
                if(tmpMaxNum > 0) 
                    tmpMaxNum += nums[i];
                else
                    tmpMaxNum = nums[i];
                
                if(tmpMaxNum > maxNum)
                    maxNum = tmpMaxNum;
            }
             
             return maxNum;
        }

      方法二、也是动态规划的思想,将问题化小,用 dp[i] 表示到下标 i 为止的最大和。故有: dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i -1] : 0);

    public int maxSubArray2(int[] nums) {
            
            int n = nums.length;
            int[] dp = new int[n];
            dp[0] = nums[0];
            int max = dp[0];
            
            for (int i = 1; i < n; i++) {
                dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i -1] : 0);
                max = Math.max(max, dp[i]);
            }
            
            return max;
        }
  • 相关阅读:
    IOS-自定义返回按钮,保留系统滑动返回
    IOS-static cell 与 dynamic cell 混合使用
    IOS-快速集成检查更新
    IOS-如何优雅地拦截按钮事件(判断是否需要登录)
    IOS-更优雅地使用Static Cell
    Xcode8出现问题总结
    IOS-工程师Mac上的必备软件
    Minimum Sum of Array(map迭代器)
    C++ STL map
    Friends and Cookies(思维)
  • 原文地址:https://www.cnblogs.com/skillking/p/9650900.html
Copyright © 2011-2022 走看看