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

Leetcode2300. 咒语和药水的成功对数

Every day a Leetcode

题目来源:2300. 咒语和药水的成功对数

解法1:暴力

代码:

class Solution
{
public:
    vector<int> successfulPairs(vector<int> &spells, vector<int> &potions, long long success)
    {
        int n = spells.size(), m = potions.size();
        vector<int> pairs(n, 0);
        for (int i = 0; i < n; i++)
        {
            int count = 0;
            for (const int &potion : potions)
                if ((long long)spells[i] * potion >= success)
                    count++;
            pairs[i] = count;
        }
        return pairs;
    }
};

结果:超时。

复杂度分析:

时间复杂度:O(n * m),其中 n 是数组 spells 的长度,m 是数组 potions 的长度。

空间复杂度:O(1)。

解法2:二分查找

对于某一个咒语的能量,我们可以采用二分查找的方法来高效地找到符合条件的药水数量。

首先,我们将 potions 数组进行排序,以便能够利用有序性进行二分查找。然后,对于每个咒语 spells[i],我们计算出目标值 target = ceil(1.0 * success / spells[i]),代表了在当前咒语强度下,药水需要达到的最低强度。接下来,我们使用「二分查找」来在数组 potions 中找到第一个大于等于 target 的元素的索引 index,进一步可以得到此时表示成功组合的药水数量为 m − index,其中 m 表示数组 potions 的长度。

代码:

class Solution
{
public:
    vector<int> successfulPairs(vector<int> &spells, vector<int> &potions, long long success)
    {
        int n = spells.size(), m = potions.size();
        vector<int> pairs(n, 0);
        sort(potions.begin(), potions.end());
        for (int i = 0; i < n; i++)
        {
            long long target = ceil(1.0 * success / spells[i]);
            int left = 0, right = m - 1;
            while (left <= right)
            {
                int mid = (left + right) / 2;
                if ((long long)spells[i] * potions[mid] >= success)
                    right = mid - 1;
                else
                    left = mid + 1;
            }
            pairs[i] = m - left;
        }
        return pairs;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(m * logm + n * logm),其中 n 是数组 spells 的长度,m 是数组 potions 的长度。排序的时间复杂度为 O(m * logm),一次二分查找的时间复杂度为 O(logm),共 n 次,所有二分查找的总的时间复杂度为 O(n * logm)。

空间复杂度:O(logm),其中 m 是数组 potions 的长度

http://www.dtcms.com/a/3811.html

相关文章:

  • 适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频
  • 企业安全—三保一评
  • 解决弹窗滚动穿透
  • 整理笔记——稳压直流电路知识
  • 【Kurbernetes部署】知识点总结(部署方式、网络插件.....)
  • C++类和对象(上)
  • JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)
  • 8-2、T型加减速计算简化【51单片机控制步进电机-TB6600系列】
  • 华为认证 | 11月底这门HCIP认证即将发布!
  • 数据库常见面试题 —— 12. SQL 如何优化才能解决数据倾斜类问题
  • 拆分代码 + 动态加载 + 预加载,减少首屏资源,提升首屏性能及应用体验
  • vue3 自动导入composition-apiI和组件
  • Linux 学习(CentOS 7)
  • 【常用算法】java实现的三种分页算法
  • Python机器学习算法入门教程(第四部分)
  • MVCC中的可见性算法
  • 苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?
  • React Hooks为什么要在顶层使用?
  • 【go-zero】go-zero 脚手架 simple-admin 第二章:通过goctls生成api整个项目
  • 【公益案例展】火山引擎公益电子票据服务——连接善意,共创美好
  • Excel中功能区的存放位置很灵活,可以根据需要隐藏或显示
  • Maven中<scope>中等级的区别
  • [C]环境(0/0)→ 环境配置
  • 基于SpringBoot+Vue的婚恋相亲交友系统
  • openvino学习(一)ubuntu20.04安装openvino2022
  • 基于Pytorch框架的LSTM算法(二)——多维度单步预测
  • 如何修改CentOS登录时默认目录
  • Django ORM:数据库操作的Python化艺术
  • Mac电脑录屏软件 Screen Recorder by Omi 中文最新
  • LLVM学习笔记(60)