• Java实现最大连续子序列


    算法真的是太神奇了!!!

    初步实现:

    思路

    ◼ 给定一个长度为 n 的整数序列,求它的最大连续子序列和
    比如 –2、1、–3、4、–1、2、1、–5、4 的最大连续子序列和是 4 + (–1) + 2 + 1 = 6
    ◼ 状态定义
    假设 dp(i) 是以 nums[i] 结尾的最大连续子序列和(nums是整个序列)
    ✓ 以 nums[0] –2 结尾的最大连续子序列是 –2,所以 dp(0) = –2
    ✓ 以 nums[1] 1 结尾的最大连续子序列是 1,所以 dp(1) = 1
    ✓ 以 nums[2] –3 结尾的最大连续子序列是 1、–3,所以 dp(2) = dp(1) + (–3) = –2
    ✓ 以 nums[3] 4 结尾的最大连续子序列是 4,所以 dp(3) = 4
    ✓ 以 nums[4] –1 结尾的最大连续子序列是 4、–1,所以 dp(4) = dp(3) + (–1) = 3
    ✓ 以 nums[5] 2 结尾的最大连续子序列是 4、–1、2,所以 dp(5) = dp(4) + 2 = 5
    ✓ 以 nums[6] 1 结尾的最大连续子序列是 4、–1、2、1,所以 dp(6) = dp(5) + 1 = 6
    ✓ 以 nums[7] –5 结尾的最大连续子序列是 4、–1、2、1、–5,所以 dp(7) = dp(6) + (–5) = 1
    ✓ 以 nums[8] 4 结尾的最大连续子序列是 4、–1、2、1、–5、4,所以 dp(8) = dp(7) + 4 = 5

    ◼ 状态转移方程
    如果 dp(i – 1) ≤ 0,那么 dp(i) = nums[i]
    如果 dp(i – 1) > 0,那么 dp(i) = dp(i – 1) + nums[i]
    ◼ 初始状态
    dp(0) 的值是 nums[0]
    ◼ 最终的解
    最大连续子序列和是所有 dp(i) 中的最大值 max { dp(i) },i ∈ [0, nums.length)
     static int maxSubArray1(int[] nums) {
                    if (nums == null || nums.length == 0) return 0;
                    int[] dp = new int[nums.length];
                    dp[0] = nums[0];
                    int max = dp[0];
                    for (int i = 1; i < dp.length; i++) {
                        int prev = dp[i - 1];
                        if (prev <= 0) {
                            dp[i] = nums[i];
                        } else {
                            dp[i] = prev + nums[i];
                        }
                        max = Math.max(dp[i], max);
                    }
                    return max;
                }
    

    优化空间复杂度为O(1)级别

     static int maxSubArray2(int[] nums) {
                if (nums == null || nums.length == 0) return 0;
                int dp = nums[0];
                int max = dp;
                for (int i = 1; i < nums.length; i++) {
                    if (dp <= 0) {
                        dp = nums[i];
                    } else {
                        dp = dp + nums[i];
                    }
                    max = Math.max(dp, max);
                }
                return max;
            }
    
  • 相关阅读:
    数据泵使用笔记与相关shell
    手动创建数据库
    归档日志小试
    SQL语句的结果如何反映在SGA与磁盘中
    oracle 表空间
    linux 循环判断、数组、循环
    oracle 连接方式
    Changing Project Binding to Surround SCM Integration Provider with Visual Studio 2010
    On Caching and Evangelizing SQL
    Windows下使用python3 + selenium实现网页自动填表功能
  • 原文地址:https://www.cnblogs.com/interdrp/p/16211135.html
Copyright © 2020-2023  润新知