题解 | 咒语和药水的成功对数

题干分析:

题目给我们两个数组,一个基准值,要我们针对spells数组中的每一个值,寻找potions数组中与之相乘值大于基准值的个数.

算法思路:

很明显,针对每个spells数组中的值我们都得进行处理,因此我们这里考虑一个值的情况,设该值为s,基准值为k,即我们需要找到potions数组中大于k/s的值,针对potions[i],s,k,因此只要满足条件:

由于他们都是整数,所以:

同时为了更加方便的计数,我们不妨将positions进行排序,之后只要进行二分查找到符合要求的临界值然后计数即可.

实现代码:

vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {
        int n = static_cast<int>(spells.size());
        vector<int> ans(n);

        sort(potions.begin(), potions.end());

        for (int i = 0; i < n; ++i) {
            long long target = (success - 1) / spells[i]; // 注意除出来的数可能大于INT_MAX,因此要用long long
            if (target < potions.back())
                ans[i] = potions.end() - upper_bound(potions.begin(), potions.end(), static_cast<int>(target));
            else ans[i] = 0;
        }

        return ans;
    }

注: 这里其实可以不用另外开一个结果数组,由于spells数组的值只使用一次且大小与ans数组相等,可以直接用spells数组代替节省空间,只是个人不建议这么做,毕竟会直接覆盖spells数组中的原值(函数使用引用传参),而万一该数组原值之后还需要使用呢?

复杂度分析:

  • 时间复杂度: 排序O(mlog m),二分O(log m),每个spells数组值一次二分操作因此为O(n log m).总计O((n + m)log m).
  • 空间复杂度: 排序O(log m),结果存储O(n),总计O(n + log m).
全部评论

相关推荐

从九月中开始投,十月份开始面试。到现在也是两个月了,各种挂。面试经历这一块:1.字节一面挂&nbsp;kpi2.快手一面挂&nbsp;kpi3.作业帮一面反馈回答很好&nbsp;三天后挂4.顺丰面试官不尊重人问几个模棱两可的问题,没看过我简历一眼&nbsp;一面挂5.哈啰二面挂6.腾讯运维二面挂,面试官很有实力。7.百度提前批换了个岗位,正式批自动转的,没投java,做完笔试挂8.中间拿了个网易云音乐agent实习,没时间去,推了9.滴滴一面挂,当时网络特别不好服了重连两次,然后基础题也没答好10.经纬恒润kpi11.去哪儿&nbsp;深信服10月初ai面完无消息12.快手实习备胎,一面没过13.金山wps笔试过后简历挂14.数字马力拒了,给太少15.卓望面完说基础非常好,但是无后续16.携程测评挂,暑期也是,测评真挂人呀17.运营商一个面试没给18.其他各种笔试后挂我吧放弃了中厂年37的转正,因为加班加卡试用加业务偏运维都是杂活,但是真的非常感谢leader在我投暑期投了他们公司之后,直接给我发了offer我后面还是选择了没去。研二实习过两段,都没有什么含金量产出,都是基架运维,面试一到二面问深一点就不会。只拿到一个二线央企的16w多年薪的工作,得物投的长沙是内包也没开出来,同程等hr面但裁应届,找不到想要的业务方向和实习。看着硕士室友美团50大包蔚来40大包,再看看自己瞎折腾啥都没捞着。想找业务实习春招,找不到。已经预测到春招也是一样的结果,可能我的秋春招就这样了吧,有点茫然了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务