leetcode 904 水果成篮

一、题目描述

二、解题思路

题意解析:

fruit[i]是指i位置树上果实的种类,例如fruits[0]为1,代表0位置树上的是1号果实。只有两个篮子,每个篮子只能装同种果实,比如只能装1号、2号等等。一棵树只能摘一个水果,题目要求最多可以摘的水果数量。

整体思路:

题目要求最多可以摘的水果数量。也就是求只有两种类型的最长连续子串的长度,我们可以借助滑动窗口的思想来解决这个问题。

具体思路:

哈希表nums用于记录每一种类型的水果采摘的个数,用于模拟篮子。

<1>进窗口:进入哈希表nums

//进窗口

nums[fruits[right]]++;

<2>出窗口:退出哈希表,left右移

//出窗口

while(nums.size()>2){

nums[fruits[left]]--;

if (nums[fruits[left]]==0) nums.erase(fruits[left]);

left++;

}

<3>更新:更新length

//更新

length=max(length,right-left+1);

三、代码实现

时间复杂度:T(n)=O(n)

空间复杂度:S(n)=O(1)

cpp 复制代码
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        //滑动窗口
        int left,right,n=fruits.size();
        map<int,int> nums;
        int length=0;
        for(left=0,right=0;right!=n;right++){
            //进窗口
            nums[fruits[right]]++;
            //出窗口
            while(nums.size()>2){
                nums[fruits[left]]--;
                if (nums[fruits[left]]==0)  nums.erase(fruits[left]);
                left++;
            }
            //更新
            length=max(length,right-left+1);
        }
        return length;
    }
};
相关推荐
楼田莉子1 天前
Linux学习:基础IO相关学习
linux·开发语言·c++·后端·学习
风筝在晴天搁浅1 天前
代码随想录 300.最长递增子序列
算法·动态规划
小O的算法实验室1 天前
2026年EAAI SCI1区TOP,基于进化算法的多目标施工现场布局与安全规划模型,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
尋有緣1 天前
力扣1083-销售分析II
leetcode·oracle·数据库开发
.小小陈.1 天前
C++初阶5:string类使用攻略
开发语言·c++·学习·算法
代码游侠1 天前
数据结构——树
数据结构·算法
天骄t1 天前
树与哈希:数据结构核心解析
数据结构·算法
神奇的代码在哪里1 天前
C++的演进与我的编程学习之旅:从底层基础到AI应用
c++·人工智能·python·学习·程序人生·个人开发
小年糕是糕手1 天前
【C++】类和对象(六) -- 友元、内部类、匿名对象、对象拷贝时的编译器优化
开发语言·c++·算法·pdf·github·排序算法
ShineLeong1 天前
C的第一次
数据结构·算法