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)
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;}
};