leetcode刷题----904.水果成篮

1.题目描述

在这里插入图片描述
在这里插入图片描述

2.思路

这题类似于求有两个字符的最长子串。
用一个向量lens记录下标为i的有两种水果的长度,最后输出lens中的最大值即可。
怎么求lens[i]的值呢?这里我们需要两个变量basket1,basket2记录水果的类型,两个变量index1,index2当出现第三种水果类型时可能需要切换的前两种水果的下标。
从左到右遍历tree数组,得到其中的一个元素tree[i]。
1.当basket1为空时,直接将tree[i]赋值给basket1,将i赋值给index1,同时将lens[1]置1。
2.当basket1不为空时:
(1)如果tree[i]==basket1,则len[i]=len[i-1]+1,同时根据tree[i]与tree[i-1]是否相等,决定是否更新index1。
(2)如果tree[i]!=basket1:

  1. 如果basket2为空,则直接将tree[i]赋值给basket2,将i赋值给index2,同时len[i]=len[i-1]+1。
  2. 如果basket2不为空:(1)如果tree[i]==basket2,len[i]=len[i-1]+1,同时根据tree[i]与tree[i-1]是否相等,决定是否更新index2; (2)如果tree[i]!=basket2,找到index1和index2中的较大值x和其对应的水果类型y,index1=x,basket1=y,len[i]=i-x+1,index2=i,basket2=tree[i]。
    附上代码:
#include <iostream>
#include <vector>

using namespace std;
int totalFruit(vector<int>& tree) {
    int len=tree.size();
    vector<int> lens(len,0);
    int basket1,basket2;
    basket1=basket2=-1;
    int index1,index2;
    index1=index2=-1;
    for(int i=0;i<len;i++){
        if(i==0){
            lens[i]=1;
            basket1=tree[i];
            index1=i;
            continue;
        }
        if(tree[i]==basket1){
            lens[i]=lens[i-1]+1;
            if(tree[i]!=tree[i-1])
                index1=i;
        }
        else if(basket2==-1){
            basket2=tree[i];
            lens[i]=lens[i-1]+1;
            index2=i;
        }
        else{
            if(basket2==tree[i]){
                lens[i]=lens[i-1]+1;
                if(tree[i]!=tree[i-1])
                    index2=i;
            }
            else{
                if(index1<index2){
                    index1=index2;
                    basket1=basket2;
                }
                lens[i]=i-index1+1;
                index2=i;
                basket2=tree[i];
            }
        }
    }
    //for(auto item:lens)
    //cout<<item<<" ";
    sort(lens.begin(),lens.end());
    return lens.back();
}

int main(){
    cout<<"输入树的个数:";
    int number;
    cin>>number;
    if(number<=0)
        return -1;
    vector<int> test;
    for(int i=0;i<number;i++){
        int temp;
        cin>>temp;
        test.push_back(temp);
    }
    cout<<totalFruit(test);
    return 0;
}

3.运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yn359992335/article/details/89338940