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

题干分析:

题目给我们两个数组,一个基准值,要我们针对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.实习项目介绍。2.你提到熟悉&nbsp;React,请深入讲解一下&nbsp;Fiber&nbsp;架构的核心思想它解决了&nbsp;Stack&nbsp;Reconciler&nbsp;的哪些问题?work&nbsp;in&nbsp;progresstree&nbsp;和&nbsp;double&nbsp;buffering&nbsp;的作用是什么?3.在跨端方向,请详细描述&nbsp;React&nbsp;Native&nbsp;或&nbsp;Flutter&nbsp;跨端通信机制(Bridge)的工作原理。RN&nbsp;中的序列化/反序列化对性能有什么影响?你如何优化跨端通信的性能?4.讲讲你对前端架构的理解。在一个大型的、多团队协作的项目中,你是如何设计和实施模块化和组件化,以保证代码的高内聚、低耦合?5.你对&nbsp;JavaScript&nbsp;引擎(如&nbsp;V8)的工作原理有多少了解?请描述&nbsp;V8&nbsp;是如何将&nbsp;JS&nbsp;代码转化为机器码并执行的,涉及哪些关键步骤?6.在一个复杂的跨端应用中,你遇到过哪些难以调试的跨端兼容性问题?举个具体的例子,你是如何定位并解决它的?7.如果让你来设计一个通用的状态管理方案,你需要考虑哪些因素(比如数据流向、异步处理、跨页面/跨端共享)?你认为Redux/MobX和&nbsp;Zustand/Pinia&nbsp;的设计哲学核心区别在哪里?8.手写一个&nbsp;React&nbsp;的自定义&nbsp;Hook或Vue3的&nbsp;CompositionAPI,要求实现一个全局错误边界(Error&nbsp;Boundary)或性能监控的功能,并说明其在跨端场景中的特殊性。9.你对&nbsp;全栈实践&nbsp;有了解,如果让你用&nbsp;Node.js&nbsp;搭建一个&nbsp;BFF&nbsp;层(Backend&nbsp;For&nbsp;Frontend),你会如何设计&nbsp;API&nbsp;聚合和数据缓存策略?10.反问环节,你有什么想了解的吗?
查看10道真题和解析
点赞 评论 收藏
分享
从九月中开始投,十月份开始面试。到现在也是两个月了,各种挂。面试经历这一块: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大包,再看看自己瞎折腾啥都没捞着。想找业务实习春招,找不到。已经预测到春招也是一样的结果,可能我的秋春招就这样了吧,有点茫然了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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