300. Longest Increasing Subsequence

来源:互联网 发布:java语言培训哪家好 编辑:程序博客网 时间:2024/06/10 01:20

最长递增子序列问题,子序列可以不连续

牛客网有讲

建一个辅助数组arr,arr[i]记录i+1长度的最长递增子序列的最小结尾

首先将第一个位置初始化为原数组的第一个位置的值

遍历原数组,比较原数组的值与辅助数组有效区的值 找到有效区中第一个比这个值大的位置将这个数填到这个位置 那么这个位置的索引值+1 就以刚才这个值结尾的最长递增子序列的长度  如果有效区的值都比这个值小那就在最后加长这个有效区 

记一个全局变量 来记录这个最大值


public class Solution {    public int lengthOfLIS(int[] nums) {        if(nums.length==0) return 0;        int []arr=new int[nums.length];        arr[0]=nums[0];        int max=1;        for(int i=1;i<nums.length;i++){            if(arr[max-1]<nums[i])            {                arr[max++]=nums[i];            }            for(int j=0;j<max;j++){                if(arr[j]>=nums[i])                    {arr[j]=nums[i];                    break;                    }            }        }        return max;    }}



dp方法:

建一个辅助数组

记录以i位置结尾的最长递增子序列的长度,每次将原数组nums[i]位置的值与nums[0-(i-1)]位置的数值进行比较如果大,则将对应位置的arr值+1记录下来遍历之后取最大值就是此位置的最长递增子序列的长度


public class Solution {    public int lengthOfLIS(int[] nums) {        if(nums.length==0) return 0;        int []arr=new int[nums.length];        int  max=0;        arr[0]=1;        for(int i=1;i<nums.length;i++){            for(int j=0;j<i;j++){                if(nums[i]>nums[j])                    arr[i]=Math.max(arr[j]+1,arr[i]);            }            if (arr[i]==0) arr[i]=1;     //如果小 那么这个时候arr[i]=0  +1 这是截止到目前最小的值        }        for(int i=0;i<arr.length;i++){            max=Math.max(max,arr[i]);        }       return max;    }}




0 0
原创粉丝点击