題目說得挺複雜,但是實際上就是求出乙個連續子陣列,只含有兩種元素且長度最長,主要思路來自最大連續子陣列和演算法(動態規劃解釋)
題目舉例:
輸入:[3,3,3,1,2,1,1,2,3,3,4]
輸出:5
解釋:[1,2,1,1,2]
具體思路:
記原陣列為a,定義和a等長的陣列b,陣列中的元素b[i]表示的含義為以a[i]為結束的最長的只含兩種元素的連續子陣列,比如:
a = [3,3,3,1,2]b[0] = 1 => 是子陣列[1 ]的長度
b[1] = 2 => 是子陣列[1,3 ]的長度
b[2] = 3 => 是子陣列[1,3,3 ]的長度
b[3] = 4 => 是子陣列[1,3,3,1 ]的長度
b[4] = 2 => 是子陣列[ 1,2]的長度
顯然可以知道的是,b中的最大值,就是整個問題的解,下面**b[i+1]和b[i]之間的關係:
注意到每個b[i]都代表乙個子陣列,所以其實也可以看做是子陣列的生成過程
① b中的元素種類小足2,那就直接把a[i]加入子陣列,同時注意更新元素種類數量(上述例子中的b[0]、b[1])
② b中的元素種類為2,在細分兩種情況:
如果a[i+1]是b[i]中兩種元素之一,那麼b[i+1] = b[i] + 1(上述例子中的b[2]、b[3])
如果a[i+1]不是b[i]中兩種元素之一,那麼需要保留靠後面的一種,並且只能保留最後面的那一段,以保持連續性(上述例子中的b[4])
構造完成之後輸出最大值即可。和最大連續子陣列和演算法(動態規劃解釋)類似,這個演算法在實現過程可以進行程式設計上的優化,b[i+1]只和b[i]、a[i+1]相關,最大值也可以邊算邊記錄,子陣列並不需要整個記錄,具體**如下:
class solution else if (typecount == 1)sublen++;
} else else
} else
}max = max > sublen ? max : sublen;
}return max;
}};
在具體實現中,對於型別的管理、最後一段的位置的更新可能會有點繞,但這並不是本演算法的重點,理清楚了基本演算法,剩下的實際上只要細心點就可以理清楚的。
最長不下降子串行的兩種解法
第一種 o n 2 的複雜度的解法.這裡dp陣列記錄的是到第i個位置,當前最長的子串行的長度 include include include include using namespace std int dp 105 int a 105 int main for i 0 i1 對每個新的位置,初始...
最長上公升子串行的兩種寫法
乙個序列a 找出它的最長上公升子串行的個數,很明顯是4個,可以是,或者。他有兩種實現的方法 第一種是時間複雜度為o n 2 的演算法 include include include include using namespace std intmain int n sizeof a sizeof i...
最長上公升子串行的兩種解法
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...