題目描述
給定一個未經排序的整數數組,找到最長且連續的的遞增序列。
示例 1:
輸入: [1,3,5,4,7]
輸出: 3
解釋: 最長連續遞增序列是 [1,3,5], 長度爲3。
儘管 [1,3,5,7] 也是升序的子序列, 但它不是連續的,因爲5和7在原數組裏被4隔開。
示例 2:
輸入: [2,2,2,2,2]
輸出: 1
解釋: 最長連續遞增序列是 [2], 長度爲1。
注意:數組長度不會超過10000。
初步解題思路
整體思路就是當前數字與上一個數字一個一個對比。然後計數判斷最長的遞增序列。這裏還要特別考慮爲空的情況。
定義兩個計數器,count
和max_count
,count
用來記錄當前尋找到的最長且連續的遞增序列;max_count
用來記錄歷史尋找到的最長且連續的遞增序列,如果當前尋找到的最長且連續的遞增序列大於歷史的最長且連續遞增序列,則替換掉:max_count = count
。
接下來的事情就是如何來找,依據題意我們可以設置變量left
,用於記錄上一個數字,然後當前數字與上一個數字對比,比它大則left
等於當前這個數字,coun
t加1
,否則left
等於當前這個數字,count
置1
。
C++實現
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if(nums.size()==0){
return 0;
}
int left = nums[0];
int max_count = 1;
int count = 1;
for(int i=0; i<nums.size(); i++){
if(nums[i]>left){
count = ++count;
if(count > max_count){
max_count = count;
}
} else {
count = 1;
}
left = nums[i];
}
return max_count;
}
};
C++改進
這個left
好像可以去掉,去掉之後for
循環需要從1
開始,不然nums[i-1]
就會報錯了。
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if(nums.size()==0){
return 0;
}
int max_count = 1;
int count = 1;
for(int i=1; i<nums.size(); i++){
if(nums[i]>nums[i-1]){
count = ++count;
if(count > max_count){
max_count = count;
}
} else {
count = 1;
}
}
return max_count;
}
};
完事看官方有用動態規劃做,大概的區別就在於創建一個全1的vector
:vector<int> dp(n,1);
,然後記錄遞增子序列長度,跑了一下完事一樣的。其實現如下:
class Solution {
public:
//題解:動態規劃,本題求的是最長連續遞增序列,不是遞增子序列
//dp[i]表示位置i的連續遞增子序列長度,初始化爲1,因爲每個數字是最小的遞增子序列
//狀態轉移方程:若nums[i-1]<nums[i],則dp[i]=dp[i-1]+1;否則dp[i]=1
int findLengthOfLCIS(vector<int>& nums) {
if(nums.empty())return 0;
int res=1,n=nums.size();
vector<int> dp(n,1);
for(int i=1;i<n;++i){
if(nums[i]>nums[i-1])dp[i]=dp[i-1]+1;
res=max(res,dp[i]);
}
return res;
}
};