【每日一题】【二分mid&贪心】2022年2月8日-NC163 最长上升子序列(一)
1、描述
给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。
所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,6]、[1,3,5] 则不是它的子序列。

2、介绍
最长递增子序列(longest increasing subsequence),简称LIS
3、方法1:贪心+二分
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 给定数组的最长严格上升子序列的长度。
* @param arr int整型一维数组 给定的数组
* @return int整型
*/
public int LIS (int[] arr) {
int len = 1, n = arr.length;
if(n == 0) {
return 0;
}
int[] lisArr = new int[n + 1];
lisArr[len] = arr[0];
for(int i = 1; i < n; i++) {
//len代表lisArr中的最后一个元素
if(lisArr[len] < arr[i]) {
lisArr[++len] = arr[i];
} else {
//二分,在lisArr数组中找比arr[i]小的,最靠后的位置pos
//未找到,即lisArr数组中所有元素均大于arr[i]
//需要更新lisArr数组的位置,为何不设为1呢?
int l = 1,r = len, pos = 0;
while(l <= r) {
//int mid = l + (r - l) >> 1;是错误的,原因是优先级导致的
int mid = l + ((r - l) >> 1);//位运算是为了避免溢出
//int mid = (l + r) >> 1;
if(lisArr[mid] < arr[i]) {
//更新指针
l = mid + 1;
pos = mid;
} else {
r = mid - 1;
}
}
//循环结束,找到了pos
lisArr[pos + 1] = arr[i];
//pos是最后一个位置,len不变
//pos是中间位置,len仍不变,元素继续往后填
//所以没有必要更新len位置
}
}
return len;
}
}
4、二分使用库函数实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 给定数组的最长严格上升子序列的长度。
* @param arr int整型一维数组 给定的数组
* @return int整型
*/
public int LIS (int[] arr) {
//使用二分查找确定插入位置
//贪心
int n = arr.length, len = 1;
if(n <= 1) {
return n;
}
int[] lisArr = new int[n + 1];
lisArr[len] = arr[0];
for(int i = 1; i < n; i++) {
if(lisArr[len] < arr[i]) {
lisArr[++len] = arr[i];
} else {
//从1开始
int res = Arrays.binarySearch(lisArr, 1, len + 1, arr[i]);
if(res >= 0) { //表示找到了插入位置
//即存在相同元素时,跳过
continue;
} else { //表示没有找到插入位置
//则res<0
//其值表示应插入位置的负数
int ins = -(res + 1);
lisArr[ins] = arr[i];
}
}
}
return len;
}
}
5、方法2:动态规划
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 给定数组的最长严格上升子序列的长度。
* @param arr int整型一维数组 给定的数组
* @return int整型
*/
public int LIS (int[] arr) {
//动态规划实现
//最长子序列应当使用max值记录
int n = arr.length;
if(n == 0) {
return 0;
}
int[] dp = new int[n];
Arrays.fill(dp, 1);
int maxLen = Integer.MIN_VALUE;
for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++) {
if(arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
maxLen = Math.max(maxLen, dp[i]);
}
}
return maxLen;
}
}
【每日一题】【二分mid&贪心】2022年2月8日-NC163 最长上升子序列(一)的更多相关文章
- 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说
2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...
- 关于2022年3月9日之后Typora登录不了--已解决
p.s.今天是2022.7.27,软件版本:13.6.1 (以下所有方法,亲自尝试后整理出的) 报错信息: This beta version of typora is expired, please ...
- .NET Conf 2022 – 11 月 8 日至 10 日
.NET Conf 2022 下周就正式开启了,时间是美国时间的 11月8日至10日..NET Conf 2022是一个免费的,为期三天的, 虚拟开发人员活动提供多种实时会话,其中包括来自社区和 .N ...
- [ 10.05 ]CF每日一题系列—— 962B贪心和思维?
Description: 非 * 号的地方可以放A或B,不能AA或BB,一共有a个A,b个B,问你最多放几个 Solution: 1.模拟一下,找连续空位长度,如果长度为奇数,则我可以有一个位置放任意 ...
- [ 10.03 ]CF每日一题系列—— 534B贪心
Descripe: 贪心,贪在哪里呢…… 给你初始速度,结尾速度,行驶秒数,每秒速度可变化的范围,问你行驶秒数内最远可以行驶多少距离 Solution: 贪心,我是否加速,就是看剩下的时间能不能减到原 ...
- poj 3261 二分答案+后缀数组 求至少出现k次的最长重复子序列
#include "stdio.h" #define maxn 20010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int rank[ma ...
- Java数组-2022年4月17日
目录 数组 数组Array 数组的常见异常 数组的遍历 数组的扩容 数组类型的返回值 可变长数组 排序算法 二维数组 测试代码 数组 数组Array ArrayList概念:一个连续的空间,存储多个相 ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
- 【BZOJ1816】[CQOI2010]扑克牌(二分,贪心)
[BZOJ1816][CQOI2010]扑克牌(二分,贪心) 题面 BZOJ 题解 看了一眼这题,怎么这么眼熟?woc,原来\(xzy\)的题目是搬的这道啊... 行,反正我考的时候也切了,这数据范围 ...
随机推荐
- Django 之复制粘贴必备命令(补)
一.Django 常用命令 pip install django==3.2 pip show django pip list django-admin startproject mysite pyth ...
- 12.第十一篇 安装docker引擎
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483838&idx=1&sn=5a13aed5 ...
- MinIO Docker 快速入门
官方文档地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 在Docker中运行MinIO单点模式 MinIO ...
- Springboot配置文件参数使用docker-compose实现动态配置
文章总结; Springboot配置文件中的一些参数可以写成变量的形式,具体变量的值可以从docker-compose.yml文件中设置来获取 在yml文件中,通过${Envirment_variab ...
- 使用logstash同步mysql 多表数据到ElasticSearch实践
参考样式即可,具体使用配置参数根据实际情况而定 input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost/数据库 ...
- 3.配置Grafana Dashboard
本次我们通过部署 Grafana 来进行图形展示,Grafana 为我们提供了非常多的图形模板. Grafana 官网:https://grafana.com/ 1.下载安装 Grafana 我们使用 ...
- Alertmanager结合Slack使用
Slack作为一款即时通讯工具,协作沟通主要通过Channel(平台)来完成,用户可以在企业中根据用途添加多个Channel,并且通过Channel来集成各种第三方工具. 例如,我们可以为监控建立一个 ...
- MySQL实战,SQL语句
student数据库 student学生表,course课程表表,sc成绩表 -- 1.找出成绩为95分的学生的姓名 SELECT Sname FROM student WHERE Sno IN( S ...
- 《基于Apache Flink的流处理》读书笔记
前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...
- 创建SpringMVC工程
引入依赖 <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframe ...