思路:这道题的本质就是在一个数组中,找到这么一个子数组,使得这个子数组只有两个不同的数值,并且子数组的长度达到最大;用暴力的解法肯定会超时,这里沿用了KMP的字符串匹配方法;
语文能力有限,无法将整个过程很好地描述出来,自己动手按照代码跑一边即可,时间复杂度为O(n);
int totalFruit(vector<int> &tree)
{
int len = tree.size();int l = 0, r = 0;int pre = tree[0];while (r < len){
if (tree[r] != tree[l]){
break;}else{
r++;}}int now = tree[r];int start_next = r;int max = 0;while (r < len){
if (tree[r] != now) {
if (tree[r] == pre) //当前值与pre相等,为了保证start_next指向下一个子数组的左端点,需要交换pre和now的值,并更新start_next的值{
pre = now;now = tree[r];start_next = r;}else //当前值与now和pre都不想等,此时需要判断是否需要更新max,并做好下一个子数组的初始工作;{
if (r - l > max)max = r - l;l = start_next;pre = tree[start_next];start_next = r;now = tree[r];}}r++;}if (r - l > max){
max = r - l;}return max;
}