赞
踩
这应该算是一个模板
就是 在一段顺序固定的数组中,找出递增的最长一段数字(可以不连续),或者求出长度的意思
在算法题中非常常见
在这里总结一下吧
举例再说明一下:
1 3 4 6 2 7 8 9 11
最长递增子序列为1 3 4 6 7 8 9 11 长度为8
思路的话:
从第二个开始遍历,如果当前的大于上一个则length++
如果小于上一个,则对之前的元素二分查找找到刚大于当前元素的值进行替换,length不变
代码如下:
- #include <iostream>
- #include<stdio.h>
- #include<vector>
- using namespace std;
- int max_length(vector<int>&nums);
- int main() {
- vector<int>nums;
- int n;
- while(cin>>n){
- nums.push_back(n);
- }
- cout<<max_length(nums)<<endl;
- }
-
- int max_length(vector<int>&nums){
- int length=nums.size();
- //如果数组的长度小于等于1,则输出长度即可
- if(length<=1) return length;
- //temp用来保存递增的数组元素
- vector<int>temp(length);
- //初始化end=0,表示还没找
- int end=0;
- temp[0]=nums[0];
- for(int i=1;i<length;i++){
- //如果当前元素大于上一个元素,则压入
- if(nums[i]>temp[end]){
- end++;
- temp[end]=nums[i];
- }else{
- //如果当前元素小于上一元素,则对之前的元素进行二分查找将当前远胜于与刚大于当前元素的元素进行替换
- int left=0,right=end;
- while(left<right){
- int mid=left+((right-left)/2);
- if(temp[mid]<nums[i]){
- left=mid+1;
- }else{
- right=mid;
- }
- }
- temp[left]=nums[i];
- }
- }
- end++;//end++,开始为0
- return end;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。