📜  最长子序列递增的Java程序(1)

📅  最后修改于: 2023-12-03 15:10:37.655000             🧑  作者: Mango

最长子序列递增的Java程序

最长子序列递增是指在一个序列中,找到一个子序列,使得这个子序列中的元素按照从小到大的顺序排列,并且这个子序列的长度最长。

在本文中,我们将演示如何使用Java语言编写一个最长子序列递增的程序,并对程序的实现过程进行详细讲解。

实现过程

首先,我们需要定义一个方法来计算最长子序列递增的长度,该方法的输入参数为一个整数类型的数组。

public static int longestIncreasingSubsequence(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int[] dp = new int[nums.length];
    int max = 0;
    for (int i = 0; i < nums.length; i++) {
        dp[i] = 1;
        for (int j = 0; j < i; j++) {
            if (nums[j] < nums[i]) {
                dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }
        max = Math.max(max, dp[i]);
    }
    return max;
}

该方法的实现采用了动态规划的思想,时间复杂度为O(n^2)。

首先,我们定义一个数组dp,其中dp[i]表示以数组中第i个数结尾的最长递增子序列的长度,初始值都为1。

接着,我们遍历整个数组,对于每个位置i,再遍历它之前的所有位置j,如果当前位置j的数值小于当前位置i的数值,则将dp[i]的值更新为dp[j]+1和dp[i]中的较大值,表示以第j个数结尾的最长递增子序列再加上当前位置i的数值可以得到一个更大的递增子序列。

然后,我们再记录所有dp[i]值中的最大值max,即为最长递增子序列的长度。

最后,返回max即可。

示例代码

下面给出一个完整的可以运行的示例代码。

public class LongestIncreasingSubsequence {
    public static int longestIncreasingSubsequence(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            max = Math.max(max, dp[i]);
        }
        return max;
    }
    public static void main(String[] args) {
        int[] nums = {10, 9, 2, 5, 3, 7, 101, 18};
        System.out.println(longestIncreasingSubsequence(nums));
    }
}

输出结果为:4,即nums数组的最长递增子序列为[2,5,7,101],长度为4。

总结

本文介绍了如何使用Java语言实现最长子序列递增的程序,并对程序的实现过程进行了详细讲解。

实现过程中,我们采用了动态规划的思想,通过定义一个数组dp来存储以各个位置结尾的最长递增子序列的长度,遍历整个数组,在对于每个位置i,再遍历它之前的所有位置j,如果当前位置j的数值小于当前位置i的数值,则将dp[i]的值更新为dp[j]+1和dp[i]中的较大值,最后再记录所有dp[i]值中的最大值max即为最长递增子序列的长度。