栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【动态规划】最大连续字串(Java实现)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【动态规划】最大连续字串(Java实现)

文章目录
    • 1. 题目描述
    • 2. 算法思路
    • 3. 代码实现

1. 题目描述
  • 给你一个整数数组nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
  • 子数组是数组中的一个连续部分。

示例:

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

  • 输出:6

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

2. 算法思路

方法 1:暴力求解法,使用两重循环,遍历遍历,然后求和,时间复杂度高
方法 2:动态规划DP,使用辅助数组b[i]表示包括下标i之前的最大连续子序列和,递推式可以通过

  • b[i-1]+arr[i]:把arr[i]加入当前的连续子序列和
  • arr[i]:从头开始计算子序列和

两者比较取最大,即为b[i]的值

3. 代码实现
import java.util.*;

public class MaximumSubarry {
    public static void main(String[] args) {
        int[] arr = {2,3,-9,3,2,1,-1,5,-9,1,2,3};
        int result1 = DPMaximumSubarry(arr);
        System.out.println("动态规划:最大联系字串长度和为"+result1);
        int result2 = BruteForceMaxSubarry(arr);
        System.out.println("暴力求解:最大联系字串长度和为"+result2);
    }
    
    public static int DPMaximumSubarry(int[] arr){
        int sum =arr[0]; // 该方法最终返回结果
        int[] b = new int[arr.length]; // b[i]:以arr[i]结尾的最大子数组和
        b[0] = arr[0]; // 初始化第一个

        for(int i = 1; i < arr.length; i++){
            // 求解式
            b[i] = Math.max(b[i-1]+arr[i],arr[i]);
            // 更新答案
            if(b[i] > sum){
                sum = b[i];
            }
        }
        return sum;
    }

    
    public static int BruteForceMaxSubarry(int[] arr){
        int sum = Integer.MIN_VALUE;
        // 两个循环遍历起点i与终点j
        for(int i = 0;i < arr.length ;i++){
            for(int j = i;j< arr.length;j++){
                // 求解字串和
                int s = 0;
                for(int k = i; k <= j; k++){
                    s += arr[k];
                }
                sum = Math.max(sum,s);
            }
        }
        return sum;
    }
}

输出:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号