给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:

 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
 你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
 
思路:emmm,还没学动态规划,就看了一下官方思路写了一下,贪心和二分查找,二分查找主要用于优化速率。用一个dp数组保存最长子序列,从第一个数据开始,如果第二个数据比第一个数据小,如果大,就直接放到后边,然后第二个数据就顶替第一个数据,如果后边有数据,在dp数组中间,则这个数据就直接把刚好比它大的那个数据顶替掉,emmmm说不清楚。。。
直接上实例:
首先dp[0] = 10     然后发现nums[1]<dp[0],所以直接用nums[1]作为dp[0]重新开始,遇到nums[2]<dp[0],同理,遇到nums[3] = 5,放到后边,遇到nums[4] = 3,它大于2小于5,直接顶替5,以此类推
dp数组中的元素变化:
dp[numsSize] = 10
dp[numsSize] = 9
dp[numsSize] = 2
dp[numsSize] = 2  5
dp[numsSize] = 2  3
dp[numsSize] = 2  3  7
dp[numsSize] = 2  3  7  101
dp[numsSize] = 2  3  18  101
ok ok 返回长度即可。
int lengthOfLIS(int* nums, int numsSize)
{
if(numsSize == 0)
return 0;
int dp[numsSize];
int p = -1; dp[++p] = nums[0];
for(int i=0; i<numsSize; i++)
{
if(nums[i] > dp[p])
{
dp[++p] = nums[i];
}
else //进行二分查找法
{
int low = 0; //指向头部
int high = p; //指向尾部
int ptr = 0;
while(low <= high)
{
int mid = (high+low)/2; //指向中间
if(nums[i] > dp[mid])
{
ptr = mid;
low = mid+1;
}
else if(nums[i] <= dp[mid])
{
high = mid-1;
}
} if(dp[ptr] >= nums[i])
{
dp[ptr] = nums[i];
}
else
{
dp[ptr+1] = nums[i];
}
}
} return p+1;
}
 
 

(Good topic)贪心+二分查找:最长上升子序列(3.14 leetcode每日打卡)的更多相关文章

  1. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

    题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...

  2. Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找

    The link to problem:Problem - D - Codeforces   D. Range and Partition  time limit per test: 2 second ...

  3. Luogu 3402 最长公共子序列(二分,最长递增子序列)

    Luogu 3402 最长公共子序列(二分,最长递增子序列) Description 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作业: ...

  4. python实现查找最长公共子序列

    #!/usr/bin/python # -*- coding: UTF-8 -*- worlds = ['fosh','fort','vista','fish','hish','hello','ohd ...

  5. poj 1631 Bridging signals (二分||DP||最长递增子序列)

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9234   Accepted: 5037 ...

  6. C++动态规划实现查找最长公共子序列

    问题描述: 给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列.(给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共 ...

  7. BZOJ2796[Poi2012]Fibonacci Representation——贪心+二分查找

    题目描述 给出一个正整数x,问x最少能由多少个Fibonacci数加减算出. 例如1070=987+89-5-1,因此x=1070时答案是4. 输入 第一行一个正整数q (q<=10),表示有q ...

  8. hdu 4190 Distributing Ballot Boxes(贪心+二分查找)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4190 Distributing Ballot Boxes Time Limit: 20000/1000 ...

  9. 二分求最长上升子序列 二分LIS

    #include <iostream> #include <cstring> #define N 50010 using namespace std; int n; int n ...

  10. HDU 3308 线段树单点更新+区间查找最长连续子序列

    LCIS                                                              Time Limit: 6000/2000 MS (Java/Oth ...

随机推荐

  1. 01-jQuery的基本结构

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ASP.NET WebForm中asp:Repeater和UI:Grid数据为空时如何显示表头?

    一.asp:Repeater Repeater 控件用于显示被绑定在该控件上的项目的重复列表.Repeater 控件可被绑定到数据库表.XML 文件或者其他项目列表. 1.1-前台页面代码 <a ...

  3. quarkus依赖注入之七:生命周期回调

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇的知识点是bean的生命周期回调:在be ...

  4. 为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、stylelint)

    因历史遗留原因,接手的项目没有代码提醒/格式化,包括 eslint.pretttier,也没有 commit 提交校验,如 husky.commitlint.stylelint,与其期待自己或者同事的 ...

  5. Kioptrix: Level 1 (#1) 古老的Apache Samba VULN

    0×01 Vulnhub靶机渗透总结之 Kioptrix: Level 1 (#1) 系列专栏:Vulnhub靶机渗透系列 欢迎大佬:点赞️收藏关注 首发时间: 2023年8月20日 如有错误 还望告 ...

  6. ETL之apache hop数据增量同步功能

    ETL增量数据抽取CDC 概念:Change Data Capture,变化的数据捕获,也称:[增量数据抽取](名词解释) CDC是一种实现数据的增量抽取解决方案,是实现[ETL整体解决方案]中的一项 ...

  7. 2023羊城杯RE部分

    vm_wo 代码copy下来调了一下 vm_body[0]=input[i] vm_body[1]=vm_body[0]>>1 v12=vm_body[0] vm_body[2]=v12& ...

  8. QA|重写了元素定位后报错xx object has no attribute 'find_element'|网页计算器自动化测试实战

    代码如下: 1 # basepage.py 2 3 from selenium import webdriver 4 5 6 class BasePage(): 7 """ ...

  9. Android 调试桥 (adb) 使用教程/示例

    sidebar: auto Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令可用于执行各种设备操作,例如安装和调试 ...

  10. 一篇文章让你弄懂分布式一致性协议Paxos

    一.Paxos协议简介 Paxos算法由Leslie Lamport在1990年提出,它是少数在工程实践中被证实的强一致性.高可用.去中心的分布式协议.Paxos协议用于在多个副本之间在有限时间内对某 ...