当前位置: 首页 > news >正文

Leetcode 3479. Fruits Into Baskets III

  • Leetcode 3479. Fruits Into Baskets III
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3479. Fruits Into Baskets III

1. 解题思路

这一题思路本质上就是考察每一个水果被考察时找到第一个满足条件且未被使用的basket。

因此,我们只需要将basket按照其capacity进行排序,此时,考察每一个水果时,我们用二分法即可快速找到某一个坐标idx满足其后任意一个箱子都可以用于盛放该水果。此时,我们就要从对应的这些篮子当中找到其原始的坐标最小的位置即可。而这就是一个典型的segment tree的问题了。

对于segment tree,网上已经有不少相关的介绍了,我自己也写过一篇小文章作为备忘(经典算法:Segment Tree),因此这里就不过多展开了,有兴趣的读者可以自行去了解一下。

2. 代码实现

给出python代码实现如下:

class SegmentTree:
    def __init__(self, arr):
        self.length = len(arr)
        self.tree = self.build(arr)

    def feature_func(self, *args):
        return min(args)

    def build(self, arr):
        n = len(arr)
        tree = [0 for _ in range(2*n)]
        for i in range(n):
            tree[i+n] = arr[i]
        for i in range(n-1, 0, -1):
            tree[i] = self.feature_func(tree[2*i], tree[2*i+1])
        return tree

    def update(self, idx, val):
        idx = idx + self.length
        self.tree[idx] = val
        while idx > 1:
            self.tree[idx // 2] = self.feature_func(self.tree[idx], self.tree[idx ^ 1])
            idx = idx // 2
        return

    def query(self, lb, rb):
        lb += self.length 
        rb += self.length
        nodes = []
        while lb < rb:
            if lb % 2 == 1:
                nodes.append(self.tree[lb])
                lb += 1
            if rb % 2 == 0:
                nodes.append(self.tree[rb])
                rb -= 1
            lb = lb // 2
            rb = rb // 2
        if lb == rb:
            nodes.append(self.tree[rb])
        return self.feature_func(*nodes)


class Solution:
    def numOfUnplacedFruits(self, fruits: List[int], baskets: List[int]) -> int:
        n = len(fruits)
        ordered_baskets = sorted([(cap, idx) for idx, cap in enumerate(baskets)])
        ordered_baskets_capacity = [x[0] for x in ordered_baskets]
        ordered_baskets_index = [x[1] for x in ordered_baskets]
        segment_tree = SegmentTree(ordered_baskets_index)
        
        ans = 0
        for fruit in fruits:
            idx = bisect.bisect_left(ordered_baskets_capacity, fruit)
            if idx >= n:
                ans += 1
                continue
            
            left_most_avaliable = segment_tree.query(idx, n-1)
            if left_most_avaliable >= n:
                ans += 1
                continue
            
            basket = (baskets[left_most_avaliable], left_most_avaliable)
            idx = bisect.bisect_left(ordered_baskets, basket)
            segment_tree.update(idx, n)
        return ans

提交代码评测得到:耗时2398ms,占用内存43.9MB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/58553.html

相关文章:

  • 蓝桥杯第二天:2023省赛C 1题 分糖果
  • unordered_set 的常用函数
  • 【python】Flask web框架
  • ble.sh 的安装和用法
  • 如何在SpringBoot中灵活使用异步事件?
  • C++—vector类的使用及模拟实现
  • Windows 11下Git Bash执行cURL脚本400问题、CMD/PowerShell不能执行多行文本等问题记录及解决方案
  • 进程(上)【Linux操作系统】
  • Web基础:HTML快速入门
  • doris:Elasticsearch
  • 六轴传感器ICM-20608
  • 10. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--认证
  • VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1
  • Spike RISC-V ISA 模拟器
  • doris :SAP HANA
  • gRPC学习笔记
  • 双指针算法——配合例题讲解
  • 镭神C32测试LEGO-LOAM
  • IntelliJ IDEA 2021版创建springboot项目的五种方式
  • 深度解析前端页面性能优化
  • Python与SQL深度融合实战案例:打造你的数据处理秘籍
  • C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
  • 嵌入式八股C语言---指针与函数篇
  • ESP8266 入门(第 2 部分):使用 AT 命令
  • c#面试题整理7
  • JavaScript系列07-事件委托:深入剖析与实践技术
  • LeetCode 1876长度为三且各字符不同的子字符串
  • 【数据结构】-- LinkedList与链表(1)
  • Docker 实践与应用举例
  • CCF-CSP第27次认证第1题 --《如此编码》