项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.最长递增子序列(LIS)

1.问题描述

给定一个数组,就数组最长递增子序列(子序列可以不连续)

2.解法

非常经典的动态规划问题,算法的时间复杂为O(n^2),空间复杂度为O(n)。
关键是结果数组dp[i]怎么计算呢?
每次遍历所有j<i中数组的元素,判断array[j]是否小于array[i]。
如果是,检查dp[i]与dp[j]+1的大小,并且更新dp[i]。

    public static int lis() {int[] nums = {1, 3, 6, 2, 3, 4};int len = nums.length;int[] dp = new int[len];int result = 0;for(int i=0; i<len; i++) {dp[i] = 1;for(int j=0; j<i; j++) {if(nums[j] < nums[i]) {dp[i] = dp[i] > dp[j] + 1 ? dp[i] : dp[j] + 1;}}result = dp[i] > result ? dp[i] : result;}return result;}

3.O(NlgN)复杂度算法

上述解法的时间复杂度为O(N^2)。有没有更快速的解法呢?答案是可以的。
定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。
d中的元素是单调递增的,一旦是有序序列,我们处理起来相对就会容易很多,减小时间复杂度主要就是靠他了。
以a = [1, 3, 6, 2, 3, 4]为例,首先令len=0,循环从i=0开始。然后对a[i]:若a[i]>d[len],len++, d[len]=a[i],此时d = [1]。
i=1时,此时a[i] = 3,我们需要将a[i]有序地放入d中。因为d是个有序数组,我们用二分查找很容易找到a[i]应该插入的位置。假设此时插入的位置为position,如果position > len,很明显此时len++。具体到例子中,此时position=1,len=1, d = [1, 3]。
同理i=2时,此时position=3, len=2, d = [1, 3, 6]。
当i=3时,此时a[i] = 2,position=2, d = [1, 2, 6]。因为postion < len,所以len不更新,只是更新d。
当i=4时,position=3,d = [0, 1, 2, 3],同理不更新len只更新d。
当i=5是,position=4,d = [0, 1, 2, 3, 4]。因为postion > len,所以len++,此时len=3。又因为len是从0开始计数,最后的结果为len+1=4。

   public void longestincsubarrayeasy() {int[] array = {1, 3, 6, 2, 3, 4};int len = 0;int[] tmp = new int[array.length];tmp[0] = array[0];for(int i=0; i<array.length; i++) {int position = binSearch(tmp, 0, len, array[i]);tmp[position] = array[i];if (position > len) {len = position;}}// 最终的长度为len+1System.out.println("len is: " + (len+1));}public int binSearch(int[] array, int left, int right, int target) {int mid ;if(array[right] < target) {return right + 1;} else {while(left < right) {mid = (left + right) / 2;if(array[mid] < target) {left = mid + 1;} else {right = mid;}}}return left;}

2.最长连续递增子序列

上面的问题是递增子序列,如果要求连续递增子序列怎么办呢?
其实这个问题比上面那一个要简单,就是找递增的数列。如果遇到非递增的情况,比较一下当前计数值与max的大小得到新的max,然后将当前计数值重置为1即可。

    public void contlongestincsubarray() {int[] nums = {1, 3, 5, 4, 7, 8, 9, 10, 1};int count = 1;int result = 0;int begin = 0;for(int i=1; i<nums.length; i++) {if (nums[i-1] < nums[i]) {count++;} else {// 更新begin的位置if (count > result) {begin = i - count;}result = Math.max(result, count);count = 1;}}// 如果else中没有更新,保证最后要更新begin的位置与resultif (count > result) {begin = nums.length - count;}result = Math.max(result, count);System.out.println("result is: " + result);System.out.println("begin is: " + begin);}

最后的输出结果为:

result is: 5
begin is: 3

3.最大连续子序列和

因为最大连续子序列和只可能是以位置0~n-1中某个位置结尾。当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0,如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;否则,则以位置i结尾的最大连续子序列和为元素i。

    public void subMaxSum() {int[] array = {1, 3, -2, 4, -5};int maxsum = array[0];int cursum = array[0];for(int i=1; i<array.length; i++) {cursum = cursum > 0 ? cursum + array[i] : array[i];if (cursum > maxsum) {maxsum = cursum;}}System.out.println(maxsum);}

最长递增子序列(LIS longest-increment-subsequence)最长连续递增子序列 最大连续子序列和相关推荐

  1. C++longest increasing subsequence 最长递增子序列的实现之二(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  2. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  3. C++longest palindromic subsequence最长回文子序列算法实现(附完整源码)

    C++longest palindromic subsequence最长回文子序列算法 C++longest palindromic subsequence最长回文子序列算法实现完整源码(定义,实现, ...

  4. C++longest common subsequence最长公共子序列的实现(附完整源码)

    C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...

  5. C#LeetCode刷题之#594-最长和谐子序列​​​​​​​​​​​​​​(Longest Harmonious Subsequence)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3800 访问. 和谐数组是指一个数组里元素的最大值和最小值之间的差 ...

  6. Longest Ordered Subsequence 最长上升子序列+DP

    A numeric sequence of ai is ordered if a1 < a2 < - < aN. Let the subsequence of the given n ...

  7. [Swift]LeetCode522. 最长特殊序列 II | Longest Uncommon Subsequence II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. C#LeetCode刷题之#521-最长特殊序列 Ⅰ​​​​​​​(Longest Uncommon Subsequence I)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3949 访问. 给定两个字符串,你需要从这两个字符串中找出最长的特 ...

  9. 最长公共子串LCS (Longest Common Subsequence) 算法

    三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...

  10. 最长上升子序列(Longest increasing subsequence)

    问题描述         对于一串数A={a1a2a3-an},它的子序列为S={s1s2s3-sn},满足{s1<s2<s3<-<sm}.求A的最长子序列的长度. 动态规划法 ...

最新文章

  1. 小程序点击图片自动播放视频,停止上一个视频播放
  2. 在实践中我遇到stompjs, websocket和nginx的问题与总结
  3. 基于MM32F3273的MicroPython实验电路板 - 工作并不是正常
  4. Linux中查看各文件夹大小(扫盘)
  5. 中加减乘除_【泓泰花园】精雕细琢的好房子,加减乘除里都是幸福
  6. 深度学习核心技术精讲100篇(四十九)-深度学习之关联规则
  7. 如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...
  8. 图像处理之图像特征匹配
  9. Linux软件安装的几种方法 (一)—— apt-get
  10. Go语言的原子操作和互斥锁的区别
  11. d3 svg path添加文本_数据可视化——D3展现数据最炫丽的一面
  12. window下的免安装redis
  13. linux系统下如何设置和修改文件和文件夹的读、写、执行权限
  14. python3 -m pip install pymongo_Python3上Pymongo的SSL握手问题
  15. Windows 10官方镜像下载教程
  16. 画图软件gliffy
  17. python 更换列名
  18. 【数据科学家】如何成为一名数据科学家?
  19. numpy 判断是否实数
  20. dlib android版本号,dlib-android

热门文章

  1. flask 请求上下文
  2. 【云周刊】第200期:云栖专辑 | 阿里开发者们的第6个感悟:享受折磨
  3. java B2B2C Springboot电子商城系统-消息队列之 RabbitMQ
  4. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
  5. 【Docker篇之三】Dockerfile创建镜像
  6. 前端:用css打造炫酷3d特效- css3d立方体
  7. HTTP服务基础 、 网页内容访问 、 安全Web服务 、 部署动态网站
  8. Oracle查询显示CLOB的内容
  9. 集成Android SlidingMenu(SlideMenu)
  10. 关于BinaryFormatter