leedcode 590.水果成篮

发布于:2023-01-04 ⋅ 阅读:(149) ⋅ 点赞:(0)

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

示例 1:

输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。
示例 2:

输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。
示例 3:

输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。
示例 4:

输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:可以采摘 [1,2,1,1,2] 这五棵树。
 

提示:

1 <= fruits.length <= 105
0 <= fruits[i] < fruits.length
 

难点:

当水果种类超过两个的时候,原本是三号水果和一号水果分别在两个果篮中,现在删掉三号果篮  将新添加进来的二号水果放入第二个果篮,一号水果本来在第一个水果,现在放在第一个果篮中  并求出能摘到的水果的最大值

#include<iostream>
#include<unordered_map>
using namespace std;
int n, ans, fruits[1005];
int k;//kind表示当前水果的种类
int main() {
	unordered_map<int, int >hash_map;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> fruits[i];
	}
	//i表示指向的是第二个水果,j只想的是第一个水果
	for (int i = 1, j = 1; i <= n&&j<=n; i++) {
		if (hash_map[fruits[i]]==0) {
			k++;

		}
		
		hash_map[fruits[i]]++;
		//3 3 3 1 2 1 1 2 3 3 4
		while (k > 2) {//当水果种类超过两个的时候,原本是三号水果和一号水果分别在两个果篮中,现在删掉三号果篮  将新添加进来的二号水果放入第二个果篮,一号水果本来在第一个水果,现在放在第一个果篮中  并求出能摘到的水果的最大值

			hash_map[fruits[j]]--;
			if (hash_map[fruits[j]] == 0) {
				k--;
		    }
			j++;

		}
		
		if (k == 2) {
		ans = max(ans, i - j + 1);
			//cout << "ans:" << ans << endl;
		}
		
	}
        cout << "ans:" << ans << endl;
	return 0;

}

刚开始的时候看到每种型号的水果经过采摘可以得到不同的数目就想到了 要用哈希表  一个key值对应一个value值