当前位置:   article > 正文

Leetcode刷题笔记题解(C++):寻找最长递增子序列的长度_找到一串数字中最长递增序列的长度

找到一串数字中最长递增序列的长度

这应该算是一个模板

就是 在一段顺序固定的数组中,找出递增的最长一段数字(可以不连续),或者求出长度的意思

在算法题中非常常见

在这里总结一下吧

举例再说明一下:

1 3 4 6 2 7 8 9 11

最长递增子序列为1 3 4 6 7 8 9 11 长度为8

思路的话:

从第二个开始遍历,如果当前的大于上一个则length++

如果小于上一个,则对之前的元素二分查找找到刚大于当前元素的值进行替换,length不变

代码如下:

  1. #include <iostream>
  2. #include<stdio.h>
  3. #include<vector>
  4. using namespace std;
  5. int max_length(vector<int>&nums);
  6. int main() {
  7. vector<int>nums;
  8. int n;
  9. while(cin>>n){
  10. nums.push_back(n);
  11. }
  12. cout<<max_length(nums)<<endl;
  13. }
  14. int max_length(vector<int>&nums){
  15. int length=nums.size();
  16. //如果数组的长度小于等于1,则输出长度即可
  17. if(length<=1) return length;
  18. //temp用来保存递增的数组元素
  19. vector<int>temp(length);
  20. //初始化end=0,表示还没找
  21. int end=0;
  22. temp[0]=nums[0];
  23. for(int i=1;i<length;i++){
  24. //如果当前元素大于上一个元素,则压入
  25. if(nums[i]>temp[end]){
  26. end++;
  27. temp[end]=nums[i];
  28. }else{
  29. //如果当前元素小于上一元素,则对之前的元素进行二分查找将当前远胜于与刚大于当前元素的元素进行替换
  30. int left=0,right=end;
  31. while(left<right){
  32. int mid=left+((right-left)/2);
  33. if(temp[mid]<nums[i]){
  34. left=mid+1;
  35. }else{
  36. right=mid;
  37. }
  38. }
  39. temp[left]=nums[i];
  40. }
  41. }
  42. end++;//end++,开始为0
  43. return end;
  44. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/799400
推荐阅读
相关标签
  

闽ICP备14008679号