• Java手写最长递增子序列算法和最长递增子序列算法应用拓展案例


    Java手写最长递增子序列算法和最长递增子序列算法应用拓展案例

    1. 算法思维

    最长递增子序列算法的实现原理如下:

    1. 创建一个长度与原始序列相同的动态规划数组dp,用于记录以每个元素为结尾的最长递增子序列的长度。
    2. 初始化dp数组的所有元素为1,因为每个元素本身可以作为一个长度为1的递增子序列。
    3. 从左到右遍历原始序列,对于当前的元素nums[i],再从开头到当前元素之前的元素j进行遍历:
      • 如果nums[i]大于nums[j],说明可以将nums[i]接在以nums[j]结尾的递增子序列后面,形成一个更长的递增子序列。此时更新dp[i]的值,将其更新为dp[j] + 1。
      • 如果nums[i]小于等于nums[j],则无法将nums[i]接在以nums[j]结尾的递增子序列后面,不做任何操作。
    4. 在整个dp数组中找到最大值,即为最长递增子序列的长度。

    以下是对应的步骤的Java代码实现:

    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        
        int maxLength = 1;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            maxLength = Math.max(maxLength, dp[i]);
        }
        
        return maxLength;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这就是最长递增子序列算法的基本实现原理。通过记录每个元素结尾的最长递增子序列的长度,最终找到整个序列中最长的递增子序列的长度。根据具体的应用场景,也可以对算法进行扩展和优化,例如求出最长递增子序列的具体内容等。

    2. 最长递增子序列算法的手写必要性和市场调查

    手写最长递增子序列算法有以下必要性:

    • 理解算法的实现原理,提高编程能力;
    • 实现自定义需求,满足特定业务场景的要求;
    • 学习算法思想,为解决其他问题提供思路。

    市场调查显示,最长递增子序列算法在以下领域有广泛应用:

    • 数据分析和处理;
    • 金融和股票交易;
    • 字符串匹配和搜索;
    • 图像处理和识别。

    3. 最长递增子序列算法的详细介绍和步骤

    最长递增子序列算法的目标是找到给定序列中最长的递增子序列。以下是该算法的详细步骤:

    步骤1: 创建一个长度为n的数组dp,用于存储以每个元素为结尾的最长递增子序列的长度。

    步骤2: 初始化dp数组的所有元素为1,表示以每个元素为结尾的最长递增子序列的长度至少为1。

    步骤3: 遍历数组,对于每个元素arr[i],从0到i-1依次判断arr[i]是否可以接在arr[j]后面形成递增子序列,如果可以,则更新dp[i]的值为dp[j]+1。

    步骤4: 遍历dp数组,找到其中的最大值,即为最长递增子序列的长度。

    步骤5: 通过回溯法找出最长递增子序列的具体元素,具体步骤如下:

    • 初始化最长递增子序列为一个空数组;
    • 从dp数组中找到最大值的索引maxIndex;
    • 从maxIndex开始往前遍历dp数组,找到第一个满足dp[i] + 1 = dp[maxIndex]的索引i,将arr[i]加入最长递增子序列;
    • 将i更新为maxIndex,继续往前遍历,重复上述步骤,直到i为-1。

    4. 最长递增子序列算法的手写实现总结和思维拓展

    通过手写最长递增子序列算法,我们深入理解了算法的实现原理和应用场景。该算法的核心思想是动态规划,通过构建dp数组记录以每个元素为结尾的最长递增子序列的长度,最终找到最长递增子序列。

    思维拓展:在实际应用中,我们还可以将最长递增子序列算法进行改进,例如使用二分查找优化算法的时间复杂度。

    5. 最长递增子序列算法的完整代码

    public class LongestIncreasingSubsequence {
        public static int lengthOfLIS(int[] nums) {
            int n = nums.length;
            int[] dp = new int[n];
            Arrays.fill(dp, 1);
            
            for (int i = 1; i < n; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[i] > nums[j]) {
                        dp[i] = Math.max(dp[i], dp[j] + 1);
                    }
                }
            }
            
            int maxLength = 0;
            for (int i = 0; i < n; i++) {
                maxLength = Math.max(maxLength, dp[i]);
            }
            
            return maxLength;
        }
        
        public static List<Integer> getLIS(int[] nums, int[] dp) {
            int maxLength = 0;
            int maxIndex = 0;
            for (int i = 0; i < dp.length; i++) {
                if (dp[i] > maxLength) {
                    maxLength = dp[i];
                    maxIndex = i;
                }
            }
            
            List<Integer> lis = new ArrayList<>();
            int index = maxIndex;
            while (index >= 0) {
                if (dp[index] == maxLength) {
                    lis.add(nums[index]);
                    maxLength--;
                }
                index--;
            }
            
            Collections.reverse(lis);
            return lis;
        }
        
        public static void main(String[] args) {
            int[] nums = {10, 9, 2, 5, 3, 7, 101, 18};
            int[] dp = new int[nums.length];
            int maxLength = lengthOfLIS(nums);
            List<Integer> lis = getLIS(nums, dp);
            
            System.out.println("Length of Longest Increasing Subsequence: " + maxLength);
            System.out.println("Longest Increasing Subsequence: " + lis);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    6. 最长递增子序列算法的应用前景调研

    最长递增子序列算法在以下领域有广泛的应用前景:

    • 数据分析和处理:通过找到最长递增子序列,可以揭示数据中的潜在趋势和规律,为数据分析和处理提供基础。
    • 金融和股票交易:通过分析股票价格的最长递增子序列,可以预测股票价格的趋势,为投资决策提供参考。
    • 字符串匹配和搜索:最长递增子序列算法可以用于字符串匹配和搜索,例如在DNA序列中寻找最长递增子序列,用于基因分析。
    • 图像处理和识别:通过分析图像中像素点的最长递增子序列,可以提取出图像的边缘和轮廓,用于图像处理和识别。

    7. 最长递增子序列算法的拓展应用案例

    案例1:最长递增子序列的和最大化

    给定一个序列,找到其最长递增子序列,并计算该子序列的元素和。

    public class MaxSumOfLIS {
        public static int maxSumOfLIS(int[] nums) {
            int n = nums.length;
            int[] dp = new int[n];
            int[] sum = new int[n];
            Arrays.fill(dp, 1);
            System.arraycopy(nums, 0, sum, 0, n);
            
            for (int i = 1; i < n; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[i] > nums[j]) {
                        if (dp[j] + 1 > dp[i]) {
                            dp[i] = dp[j] + 1;
                            sum[i] = sum[j] + nums[i];
                        } else if (dp[j] + 1 == dp[i]) {
                            sum[i] = Math.max(sum[i], sum[j] + nums[i]);
                        }
                    }
                }
            }
            
            int maxSum = 0;
            int maxLength = 0;
            for (int i = 0; i < n; i++) {
                if (dp[i] > maxLength) {
                    maxLength = dp[i];
                    maxSum = sum[i];
                } else if (dp[i] == maxLength) {
                    maxSum = Math.max(maxSum, sum[i]);
                }
            }
            
            return maxSum;
        }
        
        public static void main(String[] args) {
            int[] nums = {1, 101, 2, 3, 100, 4, 5};
            int maxSum = maxSumOfLIS(nums);
            
            System.out.println("Max Sum of Longest Increasing Subsequence: " + maxSum);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    案例2:最长递增子序列的个数统计

    给定一个序列,找到其最长递增子序列,并统计该子序列的个数。

    public class CountOfLIS {
        public static int countOfLIS(int[] nums) {
            int n = nums.length;
            int[] dp = new int[n];
            int[] count = new int[n];
            Arrays.fill(dp, 1);
            Arrays.fill(count, 1);
            
            for (int i = 1; i < n; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[i] > nums[j]) {
                        if (dp[j] + 1 > dp[i]) {
                            dp[i] = dp[j] + 1;
                            count[i] = count[j];
                        } else if (dp[j] + 1 == dp[i]) {
                            count[i] += count[j];
                        }
                    }
                }
            }
            
            int maxLength = 0;
            int maxCount = 0;
            for (int i = 0; i < n; i++) {
                if (dp[i] > maxLength) {
                    maxLength = dp[i];
                    maxCount = count[i];
                } else if (dp[i] == maxLength) {
                    maxCount += count[i];
                }
            }
            
            return maxCount;
        }
        
        public static void main(String[] args) {
            int[] nums = {1, 3, 5, 4, 7};
            int count = countOfLIS(nums);
            
            System.out.println("Count of Longest Increasing Subsequence: " + count);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    8. 最长递增子序列算法的时间复杂度和空间复杂度

    最长递增子序列算法的时间复杂度为O(n^2),其中n是序列的长度。算法的空间复杂度为O(n),用于存储dp数组。在实际应用中,可以通过使用二分查找优化算法的时间复杂度,将时间复杂度降低到O(nlogn)。

  • 相关阅读:
    牛客网:NC51 合并k个已排序的链表
    linux下安装/升级GCC到较高版本
    494. 目标和【动态规划】
    win10 安装yolov7 训练自己的数据集
    java计算机毕业设计宠物寄存管理系统源码+mysql数据库+系统+lw文档+部署
    http:strict-origin-when-cross-origin报错解决方案
    C基础练习(学生管理系统)
    Codeforces Round #721 (Div. 2) C. Sequence Pair Weight
    Spring-IOC-@Value和@PropertySource用法
    Easy-laser激光测平仪维修TME910常见故障及注意事项
  • 原文地址:https://blog.csdn.net/qq_22593423/article/details/132952588