日拱算法,水果成篮问题

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

image.png

题目:

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 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] 这两棵树。
复制代码

题目来源:水果成篮


题解:



看完题目很懵,这题这么去问多少有点毛病吧?!说 fruits[i] 是代表 i 颗树上的种类,在题解中又看到官网说:数字相同的就代表是种类相同的水果;


这样理解的话,[1,2,1] 就是 1 一类,2 一类,尽可能地包含长的子数组,但又只有两类,所以结果是 [1,2,3],长度为 3

同样的:[0,1,2,2] 就是 [1,2,2],长度为 3 ,包含了两类,1 和 2 ;


所以,其实这道题目可以理解为求只包含两种元素的最长连续子序列;

基本思路: 滑动窗口

设两个双指针 l、r,r 不断前移,只要遇到两个篮子之外的水果品种,便更新 L、篮子中的水果品种 maxLen。


例如:[0,6,6,6,1,4,4,6]

第一种水果:0,第二种水果:6,第三种水果:1。当遇到第三种水果1时,要放弃第一种水果0,这时第二种水果6要保持从索引1开始,不是3。

如果是 [0,6,0,6,1,4,4,6],遇到第三种水果 1 时要放弃第一种水果0,这时第二种水果要保持从3开始。


记录 每一次水果品种发生变化 且 是该水果品种第一次出现时的索引;

当遇到第三种水果时,n 就是上一种水果的第一次出现的起始位置,也是左指针的位置。


JavaScript 实现:

var totalFruit = function(fruits) {
    let l = 0;
    let maxLen = 0;
    let n = 0
    let arr = [fruits[l]]
    for(let r = 0; r < fruits.length; r++){
        if(!arr.includes(fruits[r])){
            if(arr.length <= 1){
                arr[1] = fruits[r]
            }else{
                l = n
                arr[0] = fruits[r-1]
                arr[1] = fruits[r]
            }
        }
        if(fruits[r] !== fruits[n]){ n = r }
        maxLen = Math.max(maxLen,r-l+1)
    }
    return maxLen
};

image.png


小结:如果面试中遇到这题不熟悉肯定很难读懂题意,转换理解为处理 包含两种元素的最长连续子序列 就好理解多了,什么水果成篮,感觉有点把实际想问的问题复杂化了。不过算法解题中,读题真的也很关键。



相关文章
|
8月前
|
算法
【算法专题突破】滑动窗口 - 水果成篮(13)
【算法专题突破】滑动窗口 - 水果成篮(13)
30 0
|
6月前
|
算法 测试技术 C#
C++前缀和算法的应用:摘水果 原理源码测试用例
C++前缀和算法的应用:摘水果 原理源码测试用例
|
8月前
|
存储 算法 索引
【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词
题目描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了
327 0
|
11月前
|
机器学习/深度学习 移动开发 算法
水果识别系统Python+TensorFlow+Django网页界面+深度学习模型+卷积网络算法
水果识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
192 0
|
算法 开发者
再学一道算法题:水果忍者
再学一道算法题:水果忍者
再学一道算法题:水果忍者
|
2天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
3天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
3天前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的64QAM解调算法matlab性能仿真
**算法预览图省略** MATLAB 2022A版中,运用BP神经网络进行64QAM解调。64QAM通过6比特映射至64复数符号,提高数据速率。BP网络作为非线性解调器,学习失真信号到比特的映射,对抗信道噪声和多径效应。网络在处理非线性失真和复杂情况时展现高适应性和鲁棒性。核心代码部分未显示。
|
1天前
|
算法 计算机视觉
基于Chan-Vese算法的图像边缘提取matlab仿真
**算法预览展示了4幅图像,从边缘检测到最终分割,体现了在matlab2022a中应用的Chan-Vese水平集迭代过程。核心代码段用于更新水平集并显示迭代效果,最后生成分割结果及误差曲线。Chan-Vese模型(2001)是图像分割的经典方法,通过最小化能量函数自动检测平滑区域和清晰边界的图像分割,适用于复杂环境,广泛应用于医学影像和机器视觉。**
|
6天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
24 6