leetcode300. 最长递增子序列

题目

链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/

 

300. 最长递增子序列

难度中等1333

给你一个整数数组 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 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

分析

    建议参考:https://blog.csdn.net/mk33092250/article/details/113862228

     注意:一般的求子数组的最值问题,都可以通过一个一维数组转换,遇到数组最值问题,可优先考虑是否可以通过一维数组转换获取

    思路如下:

1.求解递增子序列,转换为通过一个一维数组保存每个index位置对应的递增子序列

2.因为每个位置的个数肯定是大于等于1,所以默认值用1填充。

int[] countArray=new int[nums.length];
Arrays.fill(countArray,1);

3.怎么判定每个位置最长递增子序列?当前位置和countArray比较,如果当前元素大于前面的元素,且当前的元素个数小于前面的元素,则将当前元素的值置为前面元素的值+1,这么不好理解,完整走一下样例。

举例

以[10,9,2,5,3,7,101,18]为例

  1. 复制原数组countArray,默认值填充1,countArray此时为[1,1,1,1,1,1,1,1];
  2. 从第二个位置开始遍历,第一个位置恒为1,第二个位置index=1,此时9<10,所以countArray第二个位置的value还是为1
  3. 第三个位置,2和10比较,2再和9比较,第三个位置也为1
  4. 第四个位置,5和10比较,5和9比较都不大于,当5和2比较时,5>2,此时,countArray[3]=countArray[2]+1,(countArray的3和2分别是原数组5和2对应的index) countArray此时为[1,1,1,2,1,1,1,1]
  5. 第五个位置,3>2,此时countArray[4]=countArray[2]+1,countArray此时为[1,1,1,2,2,1,1,1]
  6. 第六个位置,7>2,此时countArray[5]=countArray[2]+1,countArray此时为[1,1,1,2,2,2,1,1]
  7. 第六个位置,7>5,此时countArray[5]=countArray[3]+1,countArray此时为[1,1,1,2,2,3,1,1]
  8. 第六个位置,7>3,此时countArray[5]=countArray[4]+1,countArray此时为[1,1,1,2,2,3,1,1]
  9. 。。。以此类推,最终我们得到完整的countArray
  10. 遍历countArray取出,最大值,即为最大的递增子序列

代码

package org.example;

import java.util.Arrays;

public class Leetcode300 {
    public static void main(String[] args) {
        Leetcode300 leetcode300 = new Leetcode300();
        //int[] param=new int[]{10,9,2,5,3,7,101,18};
        int[] param=new int[]{10,9,2,5,3,7,101,18,19,20};
        System.out.println(leetcode300.lengthOfLIS(param) );;
    }

    public int lengthOfLIS(int[] nums) {
        int[] countArray=new int[nums.length];
        Arrays.fill(countArray,1);
        int result=1;
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i]>nums[j]&&countArray[i]<=countArray[j]){
                    countArray[i]=countArray[j]+1;
                    if (countArray[i]>result){
                        result=countArray[i];
                    }
                }
            }
        }
        return result;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值