<span>最长递增子序列</span>


原数组 arr    [4 2 3 1 5]

 LinkedList<Integer> vec ;

i        arr            vec
0         4  	         4     //直接添加
1	  2		 2    // 2小于4 替换掉4
2	  3		 2 3  //直接添加
3	  1		 1 3  //  1 小于 2  替换。  即  arr[i] 替换掉  vec中  第一个比 arr[i]大的元素。
4	  5		 1 3 5  

vec 最后的长度即是 LIS 的长度。但vec  不一定是最终的 最大上升子序列,即LIS 

maxLen[] ** 表示以 i 结尾的最长递增子序列长度**。

举个例子 arr [4,2,3,1,5]  对应的  maxLen[] 是 [1,1,2,1,3];
public class S10 {
    public static int[] LIS(int[] arr) {
        //只有一个元素 直接返回
        if (arr.length==1){
            return  arr;
        }
     
        LinkedList<Integer> vec = new LinkedList<>();
        int[] maxLen = new int[arr.length];
        vec.add(arr[0]);
        maxLen[0] = 1;
        //求vec 和 maxLen[]
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > vec.getLast()) {
                vec.add(arr[i]);
                maxLen[i] = vec.size();
            } else if (arr[i] < vec.getLast()) {
                Iterator<Integer> iterator = vec.iterator();
                int j = 0;
                while (iterator.hasNext()) {
                    Integer next = iterator.next();
                    j++;
                    if (next >= arr[i]) {
                        vec.set(j - 1, arr[i]);
                        break;
                    }
                }
                maxLen[i] = j;
            } else {
                maxLen[i] = vec.size();
            }
        }
		//通过maxLen 和 Vec 计算 最大上升子序列。
        int max = vec.size();
        int[] res = new int[max];
        int k = max - 2;
        boolean f = false;
        int left = 0;
        for (int i = arr.length - 1; i > 0; i--) {
            if (!f && vec.size() == maxLen[i]) {
                f = true;
                res[max - 1] = arr[i];
                left = maxLen[i];
            }
            if (f) {
                if (left - maxLen[i - 1]==1 && maxLen[i - 1] < max) {
                    max--;
                    res[k] = arr[i - 1];
                    k--;
                    left--;
                }
            }

        }
        return res;

    }

    public static void main(String[] args) {
        int[] arr = {1,3,8,6,5,2,5};
        int[] lis = LIS(arr);
        for (int i = 0; i < lis.length; i++) {
            System.out.println(lis[i]);
        }
    }
}

全部评论

相关推荐

沟头学院:无关比赛不要写,这样会显着你主次不分,比赛不要撒谎,有哪些就写那些,创新创业建议删除。技能特长可以适当夸大。
点赞 评论 收藏
分享
2024-12-30 22:31
吉首大学 Web前端
工字钢写代码:改成吉林就OK了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14099次浏览 183人参与
# 面试被问“你的缺点是什么?”怎么答 #
6438次浏览 100人参与
# 水滴春招 #
16515次浏览 349人参与
# 入职第四天,心情怎么样 #
11321次浏览 63人参与
# 租房找室友 #
8027次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26163次浏览 356人参与
# 职场新人生存指南 #
199236次浏览 5510人参与
# 参加完秋招的机械人,还参加春招吗? #
27018次浏览 276人参与
# 文科生还参加今年的春招吗 #
4118次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48629次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144723次浏览 829人参与
# 如果重来一次你还会读研吗 #
155719次浏览 1706人参与
# 机械人选offer,最看重什么? #
69077次浏览 449人参与
# 选择和努力,哪个更重要? #
44310次浏览 493人参与
# 如果再来一次,你还会学硬件吗 #
103647次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20521次浏览 414人参与
# 招聘要求与实际实习内容不符怎么办 #
46753次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901291次浏览 8961人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81379次浏览 496人参与
# 国企还是互联网,你怎么选? #
109198次浏览 853人参与
牛客网
牛客企业服务