LeetCode 二分算法 咒语和药水的成功对数

news/2024/10/18 16:53:09 标签: 算法, leetcode, 排序算法, c语言

咒语和药水的成功对数

给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。
同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。
请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。
示例 1:
输入:spells = [5,1,3], potions = [1,2,3,4,5], success = 7
输出:[4,0,3]
解释:
-第 0 个咒语:5 * [1,2,3,4,5] = [5,10,15,20,25] 。总共 4 个成功组合。
-第 1 个咒语:1 * [1,2,3,4,5] = [1,2,3,4,5] 。总共 0 个成功组合。
-第 2 个咒语:3 * [1,2,3,4,5] = [3,6,9,12,15] 。总共 3 个成功组合。
所以返回 [4,0,3] 。
示例 2:
输入:spells = [3,1,2], potions = [8,5,8], success = 16
输出:[2,0,2]
解释:
-第 0 个咒语:3 * [8,5,8] = [24,15,24] 。总共 2 个成功组合。
-第 1 个咒语:1 * [8,5,8] = [8,5,8] 。总共 0 个成功组合。
-第 2 个咒语:2 * [8,5,8] = [16,10,16] 。总共 2 个成功组合。
所以返回 [2,0,2] 。
提示:
n == spells.length
m == potions.length
1 <= n, m <= 105
1 <= spells[i], potions[i] <= 105
1 <= success <= 1010

题解

根据题目要求,我们需要遍历数组 spells ,然后找到数组 potions 中满足条件的个数并记录下来

如果直接枚举,时间复杂度是 n^2 有点大

所以我们可以优化 找到数组 potions 中满足条件的个数 这一步骤

题目要求 数组的中一对数据的积 >= success 那么对于每一次遍历的 spells[i],我们需要查找数组 potions 中大于 (success-1)/spells[i] 的数据个数

我们不妨将数组 potions 进行排序,然后查找到数组中第一个大于 (success-1)/spells[i] 的数据对应的下标 r ,由于排序了,所以对应的下标 r 以及之后的数组中的数据都满足条件,那么满足条件的总个数就是 potionsSize - r 个

对于有序数组的查找,我们可以使用二分查找

代码如下↓

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* successfulPairs(int* spells, int spellsSize, int* potions, int potionsSize, long long success, int* returnSize) {
    int compare(const void* a,const void* b)
    {
        return *(int*)a - *(int*)b;
    }
    *returnSize=spellsSize;
    int* arr = (int*)malloc(sizeof(int)*spellsSize);
    qsort(potions,potionsSize,sizeof(int),compare);
    for(int i=0;i<spellsSize;i++)
    {
        long long x=(success-1)/spells[i];
        if(potions[potionsSize-1]<=x)
        {
            arr[i]=0;
        }
        else
        {
            int l=0,r=potionsSize-1;
            while(l<r)
            {
                int mid=(l+r)/2;
                if(potions[mid]>x)
                {
                    r=mid;
                }
                else
                {
                    l=mid+1;
                }
            }
            arr[i]=potionsSize-r;
        }
    }
    return arr;
}

http://www.niftyadmin.cn/n/5711424.html

相关文章

基于51单片机的大棚环境检测系统设计

温室大棚环境监测系统设计&#xff1a;基于51单片机的智能化解决方案 引言 随着现代农业技术的发展&#xff0c;温室大棚种植已成为提高农作物产量和质量的重要手段。为了更好地控制温室环境&#xff0c;提高作物生长效率&#xff0c;环境监测系统成为了温室管理中不可或缺的…

Spring AI Alibaba: 支持国产大模型的Spring ai框架

Spring AI &#xff1a;java做ai应用的最好选择 过去&#xff0c;Java在AI应用开发方面缺乏一个高效且易于集成的框架&#xff0c;这限制了开发者快速构建和部署智能应用程序的能力。 Spring AI正是为解决这一问题而生&#xff0c;它提供了一套统一的接口&#xff0c;使得AI功…

中国科学院大学与美团发布首个交互式驾驶世界模型数据集DrivingDojo:推进交互式与知识丰富的驾驶世界模型

中国科学院大学与美团发布首个交互式驾驶世界模型数据集DrivingDojo&#xff1a;推进交互式与知识丰富的驾驶世界模型 Abstract 驾驶世界模型因其对复杂物理动态的建模能力而受到越来越多的关注。然而&#xff0c;由于现有驾驶数据集中的视频多样性有限&#xff0c;其卓越的建…

tavily - 简单使用

github &#xff1a;https://github.com/tavily-ai/tavily-python 安装 pip install tavily-python获取 API Key https://app.tavily.com/home 使用 from tavily import TavilyClientTAVILY_API_KEY tvly-3iO5Ek...3hbCNl# Step 1. Instantiating your TavilyClient tavily…

centors7升级GLIBC2.18

错误来源&#xff1a;找不到GLIBC2.18&#xff0c;因为glibc的版本是2.17 网上大多教程方法&#xff0c;反正我是行不通&#xff1a; 方法1&#xff1a;更新源&#xff0c;然后使用yum安装更新 方法2&#xff1a;下载源码&#xff0c;configrue&#xff0c;make执行 wget h…

宠物空气净化器选哪款?希喂、霍尼韦尔、安德迈真实测评!

自从家里养了猫&#xff0c;我的生活就多了不少乐趣&#xff0c;但也多了不少烦恼。最大的烦恼就是猫毛满天飞&#xff0c;弄得地板、衣服都是猫毛&#xff0c;甚至水杯里都能见到猫毛的踪迹。渐渐地&#xff0c;我的鼻子和喉咙都开始不舒服&#xff0c;医生给我开了先药&#…

银发产业动态:阿里、华为、京东健康、平安健康均有布局

整理 | 李梦媛 一周银发产业大事件速览 10月18日 星期五 养老服务 民政部发布《2023年度国家老龄事业发展公报》市场监管总局发布系列适老化国家标准扬州出台全国首部优待老年人地方性法规中信保诚人寿联合得到&#xff0c;共探养老综合解决方案饿了么携手北京西城&#xf…

Vue 组件 view-shadcn-ui 2024.1.1 发布

Vue 组件 view-shadcn-ui 2024.1.1 发布 View Shadcn UI 是一个基于 Shadcn UI 和 Tailwind CSS 构建的组件库。 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-community/openai-java-sdk 推…