一、环境说明

  1. 本文是 LeetCode 904题 : 水果成篮,使用c语言实现
  2. 滑动窗口+哈希集合。
  3. 测试环境:Visual Studio 2019

二、代码展示

//滑动窗口+哈希表,一次遍历O(n)
//难点:如何用判断边界的移动时机,应该可以自己实现。
//right和left不一定相同,记录窗口中两个元素,边界扩张时,如果出现新元素,fruits[right]是新元素,记录新元素。
//当kind[0]=kind[1],新元素顶替kind的一员。
//左边界left++,直到fruits[left-1]的hash值=0,说明一个元素离开窗口。
int totalFruit(int* fruits, int fruitsSize) {int hash[100001] = { 0 };//hash集合if (1 == fruitsSize) {//由题意,边界处理return 1;}else if (2 == fruitsSize) {//同样边界处理return 2;}int left = 0, right = 1;//维护左右窗口int kind[2] = { 0 };//最多关注两种水果//kind存水果种类,对应hash++kind[0] = fruits[left];hash[kind[0]]++;kind[1] = fruits[right];hash[kind[1]]++;int ans = 0;//答案while (right < fruitsSize - 1) {//右边界没到fruitsSizehash[fruits[++right]]++;//右边界右移,新水果hash++if (fruits[right] != kind[0] && fruits[right] != kind[1]) {//right遇到新水果if (kind[0] == kind[1]) {//果篮是相同水果,kind[1] = fruits[right];//kind[1]变成新水果}else {//果篮是不同水果while (1) {//左边界循环右移hash[fruits[left++]]--;//左水果--,左边界++if (0 == hash[fruits[left - 1]]) {//原先的左水果不在滑动窗口了if (fruits[left - 1] == kind[1]) {//离开的左水果是kind[1]kind[1] = kind[0];kind[0] = fruits[right];//kind[0]变新水果}else {//离开的左水果是kind[0]kind[0] = kind[1];//kind[0]变kind[1]kind[1] = fruits[right];//kind[1]变新水果}break;//跳出循环!}}}}if (kind[0] == kind[1]) {//果篮只有一种元素ans = ans < hash[kind[0]] ? hash[kind[0]] : ans;//取较大值}else {//果篮有两种元素。ans = ans < hash[kind[0]] + hash[kind[1]] ? hash[kind[0]] + hash[kind[1]] : ans;}}return ans;
}

三、思路分析

  • 滑动窗口+hash思想,思路清晰。
  • 本题水果种类用非负数表示,hash数组更简单。
  • kind[2]表示当前的水果种类,可能有1~2种。
  1. 遍历fruits,每次循环右窗口右移,新水果hash值++。当右窗口遇到第3种水果,左窗口循环右移,左水果hash值- -,直到窗口内只剩两种水果。
  2. 思路就这么简单。

四、代码分析

  • 理解思路很重要!
  • 代码实现只能说,顺着思路,添加细节,看注释吧。
  • 博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。

五、AC

六、复杂度分析

  1. 时间复杂度:O(n) ,n是fruits数组的大小。最坏时间复杂度是O(2n),对应左右窗口都移动到了fruits最右边的情况。
  2. 空间复杂度:O(|C|),|C|是kind的大小,|C|=2。

力扣(LeetCode)904. 水果成篮(C语言)相关推荐

  1. LeetCode 904. 水果成篮

    904. 水果成篮 题目:你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果 ...

  2. LeetCode 904. 水果成篮【fruit-into-baskets】

    904. 水果成篮 题目详情 题目传送门:904. 水果成篮 在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 把这棵树上的水果放进你的篮子 ...

  3. LeetCode 904. 水果成篮(滑动窗口)

    1. 题目 在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 把这棵树上的水果放进你的篮子里.如果你做不到,就停下来. 移动到当前树右侧的下 ...

  4. leetcode 904:水果成篮(滑动窗口)

    一:题目 二:思路 1.用两个篮子装进两个数,后面只能装入这两个相同的数,并统计个数;如果遇到其他数,则重新开始计数, 这里的重新开始计数指的是在去除第一个篮子中所装进的数 2.滑动窗口来做 滑动窗口 ...

  5. 2022-7-8 Leetcode 904.水果成篮

    错误的代码: class Solution {public:int totalFruit(vector<int>& fruits) {int start = 0;int end = ...

  6. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

  7. leetcode 题解 904.水果成篮(Typescript)

    /* * @lc app=leetcode.cn id=904 lang=typescript * * [904] 水果成篮(实质为求最大两元素连续子串) */ //滑动窗口 // @lc code= ...

  8. leetcode:904. 水果成篮

    题目来源 leetcode:904. 水果成篮 题目描述 题目解析 题意 题意从任意位置开始,若最多只能收集两种水果,问最多能收集多少个水果. 这道题目可以理解为求只包含两种元素的最长连续子序列,和l ...

  9. 【042】904. 水果成篮[滑动窗口]

    你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场的主人设定了一 ...

最新文章

  1. “数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力!
  2. 按钮隐藏_Win10系统:如何隐藏登录界面右下角的电源按钮?(两种方法)
  3. CentOS设置文本启动方式(命令行模式)
  4. BugkuCTF-MISC题Pokergame
  5. Win10系统如何查看电脑是否是UEFI启动模式
  6. 门禁系统产品选择与施工要点
  7. 排序之快速排序(递归)
  8. 【回放视频+PPT下载整理】Elasticsearch Meetup系列第二期
  9. 在DataGrid页眉上添加全选的CheckBox控件
  10. 计算机系统优化的方法.,20种优化电脑开机速度方法!
  11. 删除非字母字符python_python字符串如何去掉英文字母以外的字符
  12. IBDP1 经济好学吗?学习建议分享
  13. 南航里程每年清空吗_年末提醒| 除了换机票,那些即将清零的航空里程还有什么用...
  14. 国内主流云厂商下一代云主机最大可售卖384核
  15. chrome插件安装
  16. TensorFlow在win10上安装--精简教程
  17. (电脑软件启动无法验证)win10专业版如何解决无法验证发布者
  18. iphone4卡贴机(有锁版)解决通话长途助理以及号码不显示的解决办法
  19. 第一次群面——华为败北的经历小结
  20. 汽车电子系统网络安全指南与汽车信息物理融合系统网络安全指南

热门文章

  1. 阿里云MAVEN/华为MAVEN/腾讯云MAVEN 仓库地址
  2. 通过 Q-learning 深入理解强化学习-附带代码实现
  3. 关于numeric_limits
  4. 专业软件测试工程师必备之软件测试要学什么技能?
  5. 联想lenovo sl700 240G sata ps3111主控+未知颗粒 掉盘,ps3111写保护开卡量产修复过程
  6. 我的iMac苹果电脑的系统崩溃和恢复
  7. 转载分享)移动金融安全风险分析与防护
  8. 容器化技术Docker由入门到实战
  9. 剑麻的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. python学习——如何求最大公约数