动态规划问题——最长上升子序列(LIS)(二)

2023-11-02

原文转载自我的博客benym.cn

推荐链接:

  1. 动态规划问题——最长上升子序列(LIS)(一)

  2. 动态规划问题——最长上升子序列(LIS)(三)

题目描述

一天,小凯同学震惊的发现,自己无内的PM2.5指标是有规律的!小凯采样了PM2.5数值,发现PM2.5数值以小时为周期循环,即任意时刻的PM2.5总是和一小时前相等!他的室友小文同学提出了这样一个问题,在t小时内的所有采样点中,选取若干采样点的数值,能否找到一个PM2.5不曾下降过的序列?这个序列最长是多少?

输入描述

第一行有两个整数n和t,表示每小时的采样点个数,和询问多少个小时的结果。第二行有n个整数,以空格分割,表示一小时内,每个采样点观测到的PM2.5数值

输出描述

一个整数,表示T小时内,最长的PM2.5不曾下降过的序列的长度

输入

4 3
10 3 7 5

输出

4

说明

3小时内的所有采样点为 10 3 7 5 10 3 7 5 10 3 7 5 选取第2,3,5,9个采样点,可以得到一个不曾下降过的序列 3 7 10 10 使用其他的方法也可以得到长为4的满足条件的序列,但无法得到长度超过4的结果。

备注

对于20%的数据,t=1
对于50%的数据,t<=1000
对于80%的数据,PM2.5数值不超过200
对于100%的数据,1<=n<=1000,
1<=t<=1000000PM2.5数值为正整数,且不超过1000000000

优化时间复杂度(外层为n,内层为logn)

这里是定义一个testarray数组,存储这个升序子序列,对于新来的元素,通过二分查找,插入到这个testarray数组中,当大于或者等于testarray数组最后一个元素的时候直接在最后插入,如果在testarray数组中间位置,就直接在中间位置插入,(Tips:说明中间位置额那个数比需要插入的数字大,我们找的是最长的升序子序列,比他大的当然需要被小的替代了),由于testarray数组是动态变化的,最后testarray数组的大小就是最长升序子序列,并且其存储的数就是这个升序子序列。

Java代码

public class Solution {

    public int longestIncreasingSubsequence(int[] nums) {
        int len = nums.length;
        if(nums == null || len ==0)
            return 0;
        ArrayList<Integer> dp = new ArrayList<Integer>();
        for(int i=0;i<len ;i++){
            if(dp.isEmpty() || dp.get(dp.size() - 1) <= nums[i])
                dp.add(nums[i]);
            else{
                int index = findFirstLargeEqual(dp,nums[i]);
                dp.set(index,nums[i]);//  用指定的元素替代此列表中指定位置上的元素。 
            }
        }
        return dp.size();
    }
    public int findFirstLargeEqual(ArrayList<Integer> list,int num){
        int left = 0;
        int right = list.size() - 1;
        while(left <=right){
            int mid = (left + right)/2;
            if(list.get(mid) > num) 
                right = mid -1;
            else if(list.get(mid) < num)
                left = mid + 1;
            else
                return mid;
        }
        return left;
    }
}

Python代码

def longestIncreasingSubsequence(nums):
    if nums == None or len(nums) == 0:
        return 0
    testarray = list()
    for i in range(len(nums)):
        # 如果是第一个位置就直接添加进新的列表里面,如果后一个元素比新列表的最后一个元素大或者等于,则添加该元素到新列表末尾
        if len(testarray) == 0 or nums[i] >= testarray[len(testarray) - 1]:
            testarray.append(nums[i])
        else:
            # 如果这个新元素不大于等于最后一个元素的时候,利用二分查找找到他在新列表中应该插入的位置
            index = findFirstLargeEqual(testarray, nums[i])
            # 将新元素替换对应位置的列表里面的元素
            testarray[index] = nums[i]
    return len(testarray)


# 利用二分查找法
def findFirstLargeEqual(testarray, target):
    left = 0
    right = len(testarray) - 1
    if testarray[0] == target:
        return 0
    while left <= right:
        # 双斜杠整除
        mid = (left + right) // 2
        if testarray[mid] > target:
            right = mid - 1
        elif testarray[mid] < target:
            left = mid + 1
        else:
            return mid
    return left


if __name__ == "__main__":
    a = list()
    # 输入n m
    n, m = input().split()
    # 输入采样点
    n = int(n)
    a = input().split()
    # 截取输入的前n个(控制输入)
    a = a[:n]
    # 全部转化为整形
    for i in range(n):
        a[i] = int(a[i])
    # 按照小时数重复
    a = a * int(m)
    count = longestIncreasingSubsequence(a)
    print(count)

运行结果

4 3
10 3 7 5
4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划问题——最长上升子序列(LIS)(二) 的相关文章

  • Out of memory

    环境 Ubuntu Server 12 04 i686 问题描述 24G内存 空闲的有20G左右 但是内核老是报这个 动不动就杀程序 Jul 6 13 12 44 00098 kernel 3112325 883069 Out of mem
  • 利用mongodb实现分布式WEB图片存储

    利用mongodb实现分布式WEB图片存储 2012 12 22 14 00 33 标签 mongodb 分布式图片存储 nginx 分布式网站 的确在站比较小得时候 附件不多的时候 当然这样处理很好 但是当 附件数量海里去了 那这样存就蛋
  • Sass中@each、@for、@if的搭配使用

    CSS 预处理器赋予了 CSS 逻辑编程的能力 其中 Sass Less Stylus 最受欢迎 语法都是大同小异 上手也很快 在项目中使用最多的可能要数 Sass 了 本文就讲讲 Sass 中循环遍历 each for 和 if 判断的搭

随机推荐

  • SpringBoot 返回json数据 的几种方式

    一 RestController RequestMapping RestController public class TestController RequestMapping public User test User user new
  • LeetCode/LintCode 题解丨一周爆刷字符串:URL 编码

    描述 给出一个代表网址 host 的字符串 base url 和代表查询参数的列表 query params list 你需要返回带查询参数的完整 URL 查询参数列表由一些包含两个元素的数组组成 数组第一个元素代表参数 数组第二个元素代表
  • 8-js高级-4

    JavaScript 进阶 4 深浅拷贝 浅拷贝 浅拷贝 把对象拷贝给一个新的对象 开发中我们经常需要复制一个对象 如果直接赋值 则复制的是地址 修改任何一个对象 另一个对象都会变化 常见方法 拷贝对象 Object assgin 展开运算
  • postgresql安装报错

    postgresql安装报错 版本问题 版本问题 第一次下载安装postgresql 进到官网 随便点了一个12得版本进行下载 postgresql 12 12 1 windows x64 下载后双击运行 直接提示 百度了一圈 有说 用管理
  • Python实战RBF神经网络

    程序员A 哥们儿 最近手头紧 借点钱 程序员B 成啊 要多少 A 1000行不 B 咱俩谁跟谁 给你凑个整 这1024 拿去吧 之前我们讲了神经网络 人工神经网络是受到人类大脑结构的启发而创造出来的 这也是它能拥有真智能的根本原因 在我们的
  • pycharm创建py脚本自动增加注释和描述

    pycharm创建py脚本自动增加注释和描述 创建脚本时可自动带入简单注释 设备 MAC 注释内容如下 Time DATE TIME Author fanzw File NAME py Description 可自由扩展 效果如下
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

    如果想了解Java内存模型参考 jvm内存模型 和内存分配以及jdk jre jvm是什么关系 阿里 美团 京东 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题 有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制
  • 《C++ System Programming Cookbook》第一章读书笔记

    阅读书籍 C System Programming Cookbook 记录 使用docker linux 用户管理常见命令 adduser 创建用户 login 用户登录 passwd 修改用户密码 usermod a G 用户加入组 us
  • 【C语言-进阶】自定义类型详解(结构体+枚举+联合)

    结构体的声明与定义 s0 s1 s2都是struct Stu 的别名 即结构体的重命名 这种情况下就不可以在声明的同时定义变量了 sp spp都是sturct Stu类型的 n1为结构体声明的同时定义变量 在下面重新赋值时不能只写n1 还要
  • Jetson Nano中使用Darknet(AlexeyAB版本)运行YOLOV4

    之前几天使用了Darknet来跑YOLOV3 或多或少遇到了一些问题 一些问题也还没有解决 YOLOV3的作者呢之前宣布自己不再更新了 那么AlexeyAB就搞了YOLOV4的版本 接下来我们就尝试一下YOLOV4 安装Darknet Al
  • element UI 动态生成表头

    最近开始搞vue了 由于 element UI 中的 table 不能像 antd 里的 table 直接注入 json 字符串生成表头 这导致了不能轻松的通过后台生成表格 或是对表头进行排序 在网上参考找了一种最简易的方法 可以给表格里面
  • VS社区版离线试用到期解决办法

    很多朋友在学习工作中 有时需要离线安装VS2017 2019 而社区版 而社区版试用时间只有30天 到期后无法继续使用 下面教大家一种解决这个问题的办法 如下 1 下载离线授权文件 VS离线授权文件 1 开始 gt Visual Studi
  • 归并排序(递归)

    归并排序是通过递归的思想实现的排序算法 什么是递归呢 递归就是需要我们转变思想 思考将一个大事转变为一个个与原问题相似的小事 而我们需要对一个整型数组排序 应该怎样将排序整个数组这么大的规模转变为排序两个数这么小的规模呢 假设我们需要排序的
  • popwindow下拉筛选 二级联动_Excel技巧:一、二、三级联动下拉菜单制作方法分享...

    平时工作过程中 经常会用到Excel表格 关于表格数据处理还有一些小技巧的 掌握一个小技巧 可能对办公效率的提高起到很大的作用 表格中对常见的可能就是表格下拉菜单的设置了 比如说 性别 这一栏 如果每次填写都得重新输入的话 要是人数众多这工
  • vue 基于el-table实现多页多选/单选、翻页回显过程

    1 问题 表格可以多选 单选 分页的时候 表格数据能进行回显 type selection 可以设置表格进行多选 row key 指定数据的 Key 用来优化 Table 的渲染 select单选的事件 select all多选的事件 这两
  • 整数与IP地址间的转换Python

    data input split IP地址转整数 a b caozuo a append bin int i 2 rjust 8 0 for i in data for i in a b i ac int b 2 print ac data
  • SQL查询优化

    一 为什么要对SQL进行优化 我们开发项目上线初期 由于业务数据量相对较少 一些SQL的执行效率对程序运行效率的影响不太明显 而开发和运维人员也无法判断SQL对程序的运行效率有多大 故很少针对SQL进行专门的优化 而随着时间的积累 业务数据
  • AD20圆形PCB板铺铜(铜皮直径可小于板框直径)

    首先 板子是圆形的 可能会需要铺圆形的铜皮 1 画一个圆 选中后右键 选择铺铜操作 铺铜管理器 2 打开铺铜管理器后 选择来自新的 多边形 选择板外形 3 右侧选择layer以及net 设置铺铜相关的属性 4 若所铺圆形铜皮直径小于圆形板框
  • MongoDB保存与读取Numpy与Pandas格式的数据到一个数据格里

    对于Numpy格式的数据 保存时使用 Binary pickle dumps array protocol 2 其中array就是ndarry格式的数组 加载时使用 pickle loads result numpy 对于Pandas格式的
  • 动态规划问题——最长上升子序列(LIS)(二)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 一 动态规划问题 最长上升子序列 LIS 三 题目描述 一天 小凯同学震惊的发现 自己无内的PM2 5指标是有规律的 小凯采样了PM2 5数值 发现PM2