• 124、★最长递增子序列-LeetCode-300


    题目:

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

    子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

     
    示例 1:

    输入:nums = [10,9,2,5,3,7,101,18]
    输出:4
    解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/longest-increasing-subsequence

    思路:

    1. 状态的说明:①到nums[i]处,最长子序列;②以nums[i]结尾,最长子序列

    代码1是以nums[i]结尾;这个还是最容易理解和实现的!

    2.二分法:最长子序列的结尾元素实时更新,因为结尾元素越小,后面连接上的概率就越大!

    二分法的写法有很多种;

    重要的是将所有的情况都比较到,并且有合适的结束条件

    还要注意最后定位的位置;

    判断条件也很重要

    代码:

    1. 动态规划:将状态表示为:以nums[i]结尾的最长子序列!

    时间复杂度为O(N^2),以nums[i]为结尾,需要遍历之前所有的dp

    1. class Solution {
    2. public int lengthOfLIS(int[] nums) {
    3. if(nums == null || nums.length == 0) return 0;
    4. //dp数组的含义是,到当前下标,此前的最长递增子序列长度
    5. int len = nums.length;
    6. int[] dp = new int[len];
    7. Arrays.fill(dp,1);
    8. int res = 1;//到这里最短为1
    9. for(int i = 1;i < len;i++){
    10. for(int j = 0;j < i;j++){
    11. if(nums[i] > nums[j]){
    12. dp[i] = Math.max(dp[i],dp[j] + 1);
    13. }
    14. }
    15. res = Math.max(res,dp[i]);
    16. }
    17. return res;
    18. }
    19. }

    2. 二分法进行时间复杂度的优化,O(N*logN)

    1. class Solution {
    2. public int lengthOfLIS(int[] nums) {
    3. if(nums == null || nums.length == 0) return 0;
    4. int len = nums.length;
    5. int[] temp = new int[len + 1];
    6. int maxLen = 1;
    7. temp[maxLen] = nums[0];
    8. for(int k = 1;k < nums.length;k++){
    9. if(nums[k] > temp[maxLen]){
    10. temp[++maxLen] = nums[k];
    11. }
    12. //可能是小于或等于
    13. else{
    14. //二分法更新数组temp;二分法写法有很多种,主要包括所有情况即可
    15. int i = 1,j = maxLen;
    16. while(i < j){
    17. int mid = (i + j) / 2;
    18. if(temp[mid] < nums[k]){
    19. i = mid + 1;
    20. }else{
    21. j = mid;
    22. }
    23. }
    24. temp[i] = nums[k];
    25. }
    26. }
    27. return maxLen;
    28. }
    29. }

  • 相关阅读:
    基于Hadoop+Java+MySQL的歌曲推荐管理系统设计与实现
    java基于springboot+vue的网上购物商城系统
    Linux查看端口号及进程信息
    赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单
    基于前后端分离的博客系统
    【Axure教程】将figma导入Axure
    Prompt Engineering(提示工程)
    小皮面板为什么还是打不开?
    代码扫描工具选型调研
    【群答疑】jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参...
  • 原文地址:https://blog.csdn.net/weixin_54532276/article/details/125890003