网易首页 > 网易号 > 正文 申请入驻

2025-09-09:水果成篮Ⅲ。用go语言,给你两个等长的整数数组 fruits 和 baskets:fruits[i] 表示

0
分享至

2025-09-09:水果成篮Ⅲ。用go语言,给你两个等长的整数数组 fruits 和 baskets:fruits[i] 表示第 i 类水果的数量,baskets[j] 表示第 j 个篮子的容量。按 fruits 的索引从小到大依次处理每一类水果:对于当前水果,找出下标最小且尚未被占用、容量不少于该水果数量的篮子,把这类水果放入;每个篮子最多放一种水果;若不存在符合条件的空篮子,则该类水果保持未放置。所有水果处理完后,返回仍然未被放入任何篮子的水果种类数。

n == fruits.length == baskets.length。

1 <= n <= 100000。

1 <= fruits[i], baskets[i] <= 1000000000。

输入: fruits = [4,2,5], baskets = [3,5,4]。

输出: 1。

解释:

fruits[0] = 4 放入 baskets[1] = 5。

fruits[1] = 2 放入 baskets[0] = 3。

fruits[2] = 5 无法放入 baskets[2] = 4。

由于有一种水果未放置,我们返回 1。

题目来自力扣3479。

分步骤描述过程

  1. 1.初始化

  • • 首先,检查篮子数组baskets的长度。如果长度为0(即没有篮子),则所有水果都无法放置,直接返回水果的种类数(即len(fruits))。

  • • 否则,初始化一个线段树(SegTree)结构,用于高效地查询和更新篮子的状态。线段树节点数组segNode的大小为4 * m + 7(其中m是篮子的数量),篮子数组baskets被存储在线段树中。

2.构建线段树

  • • 线段树构建函数build被调用,递归地将篮子数组构建成线段树。每个叶子节点存储对应篮子的容量,内部节点存储其左右子树的最大值(即区间内的最大篮子容量)。

3.处理每类水果

  • • 遍历每类水果(按索引从小到大):

    • • 对于当前水果fruits[i],使用二分查找(在线段树上)寻找下标最小的、容量不小于fruits[i]且尚未被占用的篮子。

      • • 二分查找的区间为[0, m-1](即所有篮子)。

      • • 对于每个中间位置mid,查询线段树区间[0, mid]的最大值。如果该最大值大于等于当前水果的数量,说明存在符合条件的篮子(且下标最小的在左半部分),继续在左半部分查找;否则在右半部分查找。

    • • 如果找到了这样的篮子(res != -1)并且该篮子的容量确实大于等于水果数量(实际上通过线段树查询已经保证了这一点),则将该篮子标记为已被占用(通过线段树更新将该篮子的容量设置为INT_MIN,这样后续查询就不会再找到它)。

    • • 如果没有找到符合条件的篮子,则未放置的水果种类数count加1。

4.返回结果

  • • 处理完所有水果后,返回未放置的水果种类数count

总的时间复杂度和总的额外空间复杂度
  • 时间复杂度

    • • 构建线段树:O(m),其中 m 是篮子的数量。

    • • 处理每类水果:对于每类水果,进行二分查找(每次二分查找需要 O(log m) 时间),每次二分查找中需要在线段树上查询(每次查询也是 O(log m) 时间),并且如果找到篮子还需要更新线段树(一次更新也是 O(log m) 时间)。因此处理每类水果的总时间是 O(log² m)(因为二分查找和线段树操作都是对数时间)。

    • • 总共有 n 类水果,所以总时间复杂度为 O(n * log² m)。由于 n 和 m 等长(题目中 n == m),所以可以表示为 O(n * log² n)。

  • 额外空间复杂度

    • • 线段树需要 O(m) 的额外空间(即 4 * m + 7),因此额外空间复杂度为 O(m)。由于 m = n,所以为 O(n)。

总结:

  • • 时间复杂度:O(n * log² n)

  • • 额外空间复杂度:O(n)

Go完整代码如下:

package main import (     "fmt"     "math" ) const (     INT_MIN = math.MinInt32 ) type SegTree struct {     segNode []int     baskets []int } func (this *SegTree) build(p, l, r int) {     if l == r {         this.segNode[p] = this.baskets[l]         return     }     mid := (l + r) >> 1     this.build(p<<1, l, mid)     this.build(p<<1|1, mid+1, r)     this.segNode[p] = max(this.segNode[p<<1], this.segNode[p<<1|1]) } func (this *SegTree) query(p, l, r, ql, qr int) int {     if ql > r || qr < l {         return INT_MIN     }     if ql <= l && r <= qr {         return this.segNode[p]     }     mid := (l + r) >> 1     return max(this.query(p<<1, l, mid, ql, qr),         this.query(p<<1|1, mid+1, r, ql, qr)) } func (this *SegTree) update(p, l, r, pos, val int) {     if l == r {         this.segNode[p] = val         return     }     mid := (l + r) >> 1     if pos <= mid {         this.update(p<<1, l, mid, pos, val)     } else {         this.update(p<<1|1, mid+1, r, pos, val)     }     this.segNode[p] = max(this.segNode[p<<1], this.segNode[p<<1|1]) } func numOfUnplacedFruits(fruits []int, baskets []int)int {     m := len(baskets)     if m == 0 {         returnlen(fruits)     }     tree := SegTree{         segNode: make([]int, 4*m+7),         baskets: baskets,     }     tree.build(1, 0, m-1)     count := 0     for i := 0; i < len(fruits); i++ {         l, r, res := 0, m-1, -1         for l <= r {             mid := (l + r) >> 1             if tree.query(1, 0, m-1, 0, mid) >= fruits[i] {                 res = mid                 r = mid - 1             } else {                 l = mid + 1             }         }         if res != -1 && tree.baskets[res] >= fruits[i] {             tree.update(1, 0, m-1, res, INT_MIN)         } else {             count++         }     }     return count } func main() {     fruits := []int{4, 2, 5}     baskets := []int{3, 5, 4}     result := numOfUnplacedFruits(fruits, baskets)     fmt.Println(result) }

Python完整代码如下:

# -*-coding:utf-8-*- import sys INT_MIN = -2**31 class SegTree:     def __init__(self, baskets):         self.baskets = baskets         self.n = len(baskets)         self.seg = [INT_MIN] * (4 * self.n + 7)         if self.n > 0:             self.build(1, 0, self.n - 1)     def build(self, p, l, r):         if l == r:             self.seg[p] = self.baskets[l]             return         mid = (l + r) // 2         self.build(p * 2, l, mid)         self.build(p * 2 + 1, mid + 1, r)         self.seg[p] = max(self.seg[p * 2], self.seg[p * 2 + 1])     def query(self, p, l, r, ql, qr):         if ql > r or qr < l:             return INT_MIN         if ql <= l and r <= qr:             return self.seg[p]         mid = (l + r) // 2         return max(self.query(p * 2, l, mid, ql, qr),                    self.query(p * 2 + 1, mid + 1, r, ql, qr))     def update(self, p, l, r, pos, val):         if l == r:             self.seg[p] = val             return         mid = (l + r) // 2         if pos <= mid:             self.update(p * 2, l, mid, pos, val)         else:             self.update(p * 2 + 1, mid + 1, r, pos, val)         self.seg[p] = max(self.seg[p * 2], self.seg[p * 2 + 1]) def numOfUnplacedFruits(fruits, baskets):     m = len(baskets)     if m == 0:         returnlen(fruits)     tree = SegTree(baskets)     count = 0     for f in fruits:         l, r, res = 0, m - 1, -1         # 在前缀 [0, mid] 上二分查找第一个有足够容量的位置         while l <= r:             mid = (l + r) // 2             if tree.query(1, 0, m - 1, 0, mid) >= f:                 res = mid                 r = mid - 1             else:                 l = mid + 1         if res != -1 and tree.baskets[res] >= f:             # 标记该篮子为已用(在线段树中设为很小的值)             tree.update(1, 0, m - 1, res, INT_MIN)         else:             count += 1     return count if __name__ == "__main__":     fruits = [4, 2, 5]     baskets = [3, 5, 4]     print(numOfUnplacedFruits(fruits, baskets))

我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
42岁王濛再破天花板!退役12年,再次让李琰和整个冰坛“沉默”了

42岁王濛再破天花板!退役12年,再次让李琰和整个冰坛“沉默”了

翰飞观事
2026-02-16 11:29:39
震惊!日本韩国慌了,中国乌鲁木齐制造业为何如此强大?

震惊!日本韩国慌了,中国乌鲁木齐制造业为何如此强大?

特约前排观众
2026-02-17 00:10:05
2026马年春晚,食之无味弃之可惜,小品歌舞节目质量一言难尽

2026马年春晚,食之无味弃之可惜,小品歌舞节目质量一言难尽

辣条小剧场
2026-02-17 00:51:29
男子花80块钱请人画画,付款时,要了张收据,50年后,这张收据卖了180万

男子花80块钱请人画画,付款时,要了张收据,50年后,这张收据卖了180万

霹雳炮
2026-02-14 20:47:47
以色列已经告诉世界:日本若敢拥有核武器,美国并不会第一个翻脸

以色列已经告诉世界:日本若敢拥有核武器,美国并不会第一个翻脸

八斗小先生
2025-12-26 09:33:27
马年春节前,黄一鸣带闪闪给王健林夫妇拜年,小心思路人皆知

马年春节前,黄一鸣带闪闪给王健林夫妇拜年,小心思路人皆知

一盅情怀
2026-02-15 13:03:59
罗翔毁弃,牢A雷鸣

罗翔毁弃,牢A雷鸣

深度报
2026-02-14 21:14:41
外媒都盯着095攻击型核潜艇,却没注意东大海军公布了一个大消息

外媒都盯着095攻击型核潜艇,却没注意东大海军公布了一个大消息

阿龙聊军事
2026-02-16 22:29:43
场均6+8+1,3年2次赛季报销!火箭仍当宝?斯通不愿送出32岁老将

场均6+8+1,3年2次赛季报销!火箭仍当宝?斯通不愿送出32岁老将

熊哥爱篮球
2026-02-17 11:07:25
周总理为什么不愿在人民大会堂国画《江山如此多娇》上题词?

周总理为什么不愿在人民大会堂国画《江山如此多娇》上题词?

老杉说历史
2026-02-16 18:05:07
女子假信佛与多位高僧发生不当关系,秘密录制5600段视频。

女子假信佛与多位高僧发生不当关系,秘密录制5600段视频。

特约前排观众
2026-02-09 00:05:05
独家揭秘:“两个蔡明”春晚同台背后的仿生黑科技|甲子光年

独家揭秘:“两个蔡明”春晚同台背后的仿生黑科技|甲子光年

甲子光年
2026-02-16 21:02:24
颠覆认知!超150万人数据证实:打牌、麻将动脑型久坐,反而有益认知健康

颠覆认知!超150万人数据证实:打牌、麻将动脑型久坐,反而有益认知健康

医诺维
2026-02-14 16:34:57
内斗再开?国民党中央委员选举,朱立伦大获成功,郑丽文排名靠后

内斗再开?国民党中央委员选举,朱立伦大获成功,郑丽文排名靠后

来科点谱
2025-12-31 09:07:02
经济下行,小偷又开始冒头了,女子火车上熟睡,8000元手机被偷

经济下行,小偷又开始冒头了,女子火车上熟睡,8000元手机被偷

文青大叔说
2026-02-14 17:08:16
有上海户口的上海人,现在还是有资格居住在上海的

有上海户口的上海人,现在还是有资格居住在上海的

上海云河
2026-02-16 21:22:00
有色金属价格可能还会上涨,全球十大战略小金属稀缺度排名

有色金属价格可能还会上涨,全球十大战略小金属稀缺度排名

三农老历
2026-02-16 20:28:44
世体:皇马在光明球场进行训练,姆巴佩确认身体状态可以首发

世体:皇马在光明球场进行训练,姆巴佩确认身体状态可以首发

懂球帝
2026-02-17 07:18:07
冬奥会突发!中国选手刘佳宇头部冲下摔倒,一度失去意识

冬奥会突发!中国选手刘佳宇头部冲下摔倒,一度失去意识

极目新闻
2026-02-11 22:06:18
电动车跑高速费电,装个变速箱不就行了?99%车企不敢,两家试过

电动车跑高速费电,装个变速箱不就行了?99%车企不敢,两家试过

小李车评李建红
2026-02-16 09:00:03
2026-02-17 11:24:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1131文章数 57关注度
往期回顾 全部

科技要闻

春晚这些机器人是怎样做到的?

头条要闻

蔡磊一家三口出镜送祝福 儿子将手放在他手上轻轻抚摸

头条要闻

蔡磊一家三口出镜送祝福 儿子将手放在他手上轻轻抚摸

体育要闻

谷爱凌:'不小心"拿到了银牌 祝大家马年大吉

娱乐要闻

王菲六登春晚献唱 水滴钻石耳环再出圈

财经要闻

大年初一,这三件事很不寻常

汽车要闻

问界M6更多信息:乾崑智驾ADS4.0+鸿蒙座舱5.0

态度原创

艺术
手机
游戏
公开课
军事航空

艺术要闻

这幅字调查百人,无人识别,竟如此难懂!

手机要闻

iPhone 18 Pro会让你失望:叫iPhone 17S Pro更贴切

华硕Xbox掌机突然大幅涨价!还没买的更难受了

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

慕安会美国角色逆转 中国议题"打满全场"

无障碍浏览 进入关怀版