算法:最长增长序列300. Longest Increasing Subsequence

算法:最长增长序列300. Longest Increasing Subsequence

Given an integer array nums, return the length of the longest strictly increasing subsequence.

A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of the remaining elements. For example, [3,6,2,7] is a subsequence of the array [0,3,1,6,2,2,7].

Example 1:

Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Example 2:

Input: nums = [0,1,0,3,2,3]
Output: 4
Example 3:

Input: nums = [7,7,7,7,7,7,7]
Output: 1

Constraints:

1 <= nums.length <= 2500
-104 <= nums[i] <= 104

Follow up: Can you come up with an algorithm that runs in O(n log(n)) time complexity?

解答

这个算法其实就是。如果你把它想象成一堆卡片而不是尾巴,你可能会更容易理解它是如何工作的。桩数是最长子序列的长度。有关更多信息,请参阅。

www.zeeklog.com  - 算法:最长增长序列300. Longest Increasing Subsequence


下面的算法逻辑:

  1. 初始化一个有序数组dp;
  2. 遍历数组nums;
  3. 如果下个数字比有序数组dp的最后一个数字还大,直接追加到末尾;
  4. 否则找到刚好大于前一个数字,替换掉数字即可;为啥要这一步?想一想,已经有序的数字大小len是不变的,改变可以替换的数字,以防后面的要以小的开始排序用。
class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] dp = new int[nums.length];
        int len = 0;
        dp[len++] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > dp[len -1]) {
                dp[len++] = nums[i];
            } else {
                // replace the value in the just right place
                dp[find(dp, 0, len - 1, nums[i])] = nums[i];
            }
        }
        
        return len;
    }
    
    private int find(int[] dp, int left, int right, int n) {
        while(left < right) {
            int mid = left + ((right - left) >> 2);
            if (dp[mid] >= n) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        
        return left;
    }
}

参考

https://leetcode.com/problems/longest-increasing-subsequence/discuss/74880/JAVA-Easy-Version-To-Understand!!!

Read more

含文档+PPT+源码等]精品基于SSM的网上水果生鲜超市商城[包运行成功]计算机毕设Java项目源码

含文档+PPT+源码等]精品基于SSM的网上水果生鲜超市商城[包运行成功]计算机毕设Java项目源码

🍅文末获取联系🍅 目录 一、项目介绍 网上水果生鲜超市商城》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器 主要功能: 管理员:个人中心,用户管理,商家管理,商家分类管理,商品信息管理,系统管理等 前台:首页,商品信息,购物资讯,

By Ne0inhk
含文档+PPT+源码等]精品spring boot+MySQL新冠物资管理系统vue[包运行成功]程序设计项目源码Java毕设项目

含文档+PPT+源码等]精品spring boot+MySQL新冠物资管理系统vue[包运行成功]程序设计项目源码Java毕设项目

🍅文末获取联系🍅 目录 一、项目介绍 spring boot+vue实现的新冠物资管理系统计算机毕业设计java毕设-IT实战课堂 spring boot+MySQL新冠物资管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 操作系统:Windows 10、Windows 7、Windows 8 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、VUE.js(2.X)、css3 开发工具:IDEA(2020版)/MyEclipse(10)/Eclipse、Visual Studio Code 数据库:MySQL 5.7.26(版本号)

By Ne0inhk
含文档+PPT+源码等]精品spring boot+MySQL婚纱影楼管理系统vue[包运行成功]计算机毕设Java项目源码

含文档+PPT+源码等]精品spring boot+MySQL婚纱影楼管理系统vue[包运行成功]计算机毕设Java项目源码

🍅文末获取联系🍅 目录 一、项目介绍 spring boot+MySQL婚纱影楼管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 操作系统:Windows 10、Windows 7、Windows 8 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、VUE.js(2.X)、css3 开发工具:IDEA(2020版)/MyEclipse(10)/Eclipse、Visual Studio Code 数据库:MySQL 5.7.26(版本号) 数据库管理工具:phpstudy/Navicat

By Ne0inhk
消息队列-生产者和消费者到底是什么

消息队列-生产者和消费者到底是什么

什么是消息队列? 消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的。 消息队列,一般我们会简称它为MQ(Message Queue),嗯,就是很直白的简写。 我们先不管消息(Message)这个词,来看看队列(Queue)。这一看,队列大家应该都熟悉吧。 队列是一种先进先出的数据结构。 先进先出 先进先出 在Java里边,已经实现了不少的队列了。 那为什么还需要消息队列(MQ)这种中间件呢???其实这个问题,跟之前我学Redis的时候很像。Redis是一个以key-value形式存储的内存数据库,明明我们可以使用类似HashMap这种实现类就可以达到类似的效果了,那还为什么要Redis?《Redis真的这么快吗?》 到这里,大家可以先猜猜为什么要用消息队列(MQ)这种中间件,下面会继续补充。 消息队列可以简单理解为:把要传输的数据放在队列中。 科普: 把数据放到消息队列叫做生产者 从消息队列里边取数据叫做消费者 市面上的消息队列产品有很多,比如老牌的 ActiveMQ、RabbitMQ ,目前我看最火的 Kafka ,还

By Ne0inhk