力扣(LeetCode)904. 水果成篮(C语言)
一、环境说明
- 本文是 LeetCode 904题 : 水果成篮,使用c语言实现
- 滑动窗口+哈希集合。
- 测试环境: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种。
- 遍历fruits,每次循环右窗口右移,新水果hash值++。当右窗口遇到第3种水果,左窗口循环右移,左水果hash值- -,直到窗口内只剩两种水果。
- 思路就这么简单。
四、代码分析
- 理解思路很重要!
- 代码实现只能说,顺着思路,添加细节,看注释吧。
- 博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
- 时间复杂度:O(n) ,n是fruits数组的大小。最坏时间复杂度是O(2n),对应左右窗口都移动到了fruits最右边的情况。
- 空间复杂度:O(|C|),|C|是kind的大小,|C|=2。
力扣(LeetCode)904. 水果成篮(C语言)相关推荐
- LeetCode 904. 水果成篮
904. 水果成篮 题目:你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果 ...
- LeetCode 904. 水果成篮【fruit-into-baskets】
904. 水果成篮 题目详情 题目传送门:904. 水果成篮 在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 把这棵树上的水果放进你的篮子 ...
- LeetCode 904. 水果成篮(滑动窗口)
1. 题目 在一排树中,第 i 棵树产生 tree[i] 型的水果. 你可以从你选择的任何树开始,然后重复执行以下步骤: 把这棵树上的水果放进你的篮子里.如果你做不到,就停下来. 移动到当前树右侧的下 ...
- leetcode 904:水果成篮(滑动窗口)
一:题目 二:思路 1.用两个篮子装进两个数,后面只能装入这两个相同的数,并统计个数;如果遇到其他数,则重新开始计数, 这里的重新开始计数指的是在去除第一个篮子中所装进的数 2.滑动窗口来做 滑动窗口 ...
- 2022-7-8 Leetcode 904.水果成篮
错误的代码: class Solution {public:int totalFruit(vector<int>& fruits) {int start = 0;int end = ...
- LeetCode每日一题——904. 水果成篮
LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...
- leetcode 题解 904.水果成篮(Typescript)
/* * @lc app=leetcode.cn id=904 lang=typescript * * [904] 水果成篮(实质为求最大两元素连续子串) */ //滑动窗口 // @lc code= ...
- leetcode:904. 水果成篮
题目来源 leetcode:904. 水果成篮 题目描述 题目解析 题意 题意从任意位置开始,若最多只能收集两种水果,问最多能收集多少个水果. 这道题目可以理解为求只包含两种元素的最长连续子序列,和l ...
- 【042】904. 水果成篮[滑动窗口]
你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 . 你想要尽可能多地收集水果.然而,农场的主人设定了一 ...
最新文章
- “数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力!
- 按钮隐藏_Win10系统:如何隐藏登录界面右下角的电源按钮?(两种方法)
- CentOS设置文本启动方式(命令行模式)
- BugkuCTF-MISC题Pokergame
- Win10系统如何查看电脑是否是UEFI启动模式
- 门禁系统产品选择与施工要点
- 排序之快速排序(递归)
- 【回放视频+PPT下载整理】Elasticsearch Meetup系列第二期
- 在DataGrid页眉上添加全选的CheckBox控件
- 计算机系统优化的方法.,20种优化电脑开机速度方法!
- 删除非字母字符python_python字符串如何去掉英文字母以外的字符
- IBDP1 经济好学吗?学习建议分享
- 南航里程每年清空吗_年末提醒| 除了换机票,那些即将清零的航空里程还有什么用...
- 国内主流云厂商下一代云主机最大可售卖384核
- chrome插件安装
- TensorFlow在win10上安装--精简教程
- (电脑软件启动无法验证)win10专业版如何解决无法验证发布者
- iphone4卡贴机(有锁版)解决通话长途助理以及号码不显示的解决办法
- 第一次群面——华为败北的经历小结
- 汽车电子系统网络安全指南与汽车信息物理融合系统网络安全指南
热门文章
- 阿里云MAVEN/华为MAVEN/腾讯云MAVEN 仓库地址
- 通过 Q-learning 深入理解强化学习-附带代码实现
- 关于numeric_limits
- 专业软件测试工程师必备之软件测试要学什么技能?
- 联想lenovo sl700 240G sata ps3111主控+未知颗粒 掉盘,ps3111写保护开卡量产修复过程
- 我的iMac苹果电脑的系统崩溃和恢复
- 转载分享)移动金融安全风险分析与防护
- 容器化技术Docker由入门到实战
- 剑麻的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- python学习——如何求最大公约数