904. 水果成篮
程序员文章站
2022-07-07 08:29:18
...
在一排树中,第 i
棵树产生 tree[i]
型的水果。
你可以从你选择的任何树开始,然后重复执行以下步骤:
- 把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。
- 移动到当前树右侧的下一棵树。如果右边没有树,就停下来。
请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。
你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。
用这个程序你能收集的水果总量是多少?
示例 1:
输入:[1,2,1] 输出:3 解释:我们可以收集 [1,2,1]。
示例 2:
输入:[0,1,2,2] 输出:3 解释:我们可以收集 [1,2,2]. 如果我们从第一棵树开始,我们将只能收集到 [0, 1]。
示例 3:
输入:[1,2,3,2,2] 输出:4 解释:我们可以收集 [2,3,2,2]. 如果我们从第一棵树开始,我们将只能收集到 [1, 2]。
示例 4:
输入:[3,3,3,1,2,1,1,2,3,3,4] 输出:5 解释:我们可以收集 [1,2,1,1,2]. 如果我们从第一棵树或第八棵树开始,我们将只能收集到 4 个水果。
提示:
1 <= tree.length <= 40000
0 <= tree[i] < tree.length
Review:
这道题目可以理解为求只包含两种元素的最长连续子序列,用两个变量l,r记录前面最近出现的两种元素的位置,
遍历数组,每当遇到不同于l,r对应元素的元素时,就计算较早的一个元素l到当前新元素的距离,最后返回距离的最大值
Code:
由于快下班写的,脑子已经不转了,写的代码有点丑,效率没问题,就是有点长,也不打算重构了
public int totalFruit(int[] tree) {
int len = tree.length;
if (len<3){
return len;
}
int l = 0;
int r = 1;
int sign=1;
for (int i = 1; i < len; i++) {
r = i;
if (tree[l]!=tree[r]){
sign = ++i;
break;
}
}
if(sign==len) {
return len;
}
int res = sign - l;
int temp = res;
for (int i = sign; i < len; i++) {
if (tree[i]!=tree[l]&&tree[i]!=tree[r]){
if (temp>res){
res = temp;
}
temp = i - r + 1;
l = r;
r = i;
}else if (tree[i]==tree[l]){
temp++;
l=r;
r=i;
}else{
temp++;
}
}
return Math.max(res,temp);
}
上一篇: WPF做的登录页面