uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

leetcode 870. 优势洗牌

870. 优势洗牌

没做出来🤡

题解

复制代码
class Solution {
public:
//类比田忌赛马,数组中最小值即下等马,最大值上等马。每次用nums1中的下等马去跟nums2中的下等马pk
//如果干得过就干,干不过就用nums1中的下等马去当炮灰,去干nums2中的上等马
//在本题中,如果干得过,就用nums2中的下等马的下标当做nums1中的下等马的下标。
//干不过,就用nums2中的上等马的下标当作nums1中的下等马的下标
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        ranges::sort(nums1);
        int size = nums1.size();
        vector<int> ids(size);
        iota(ids.begin(),ids.end(),0);//这个函数是从0开始递增地填充ids
        // 对 ids 数组进行自定义排序,根据 nums2 中对应下标的值升序排列
        ranges::sort(ids,[&](int i,int j) {return nums2[i] < nums2[j];});
        vector<int> res(size);
        int left = 0,right = size - 1;
        for(int i = 0;i < size;++i){
        // 根据nums1[i]与nums2中当前最小元素(通过 ids[left] 索引获取)的关系决定将 x 放入 ans 的位置
        // 如果nums1[i]大于 nums2 中当前最小元素,则将 x 放在 ans[ids[left]] 位置并移动左指针 left
        // 否则,将 nums1[i] 放在 ans[ids[right]] 位置并移动右指针 right
            int temp;
            if(nums1[i] > nums2[ids[left]])  temp = ids[left++];
            else  temp = ids[right--];
            res[temp] = nums1[i];
        }
        return res;
    }
};
复制代码

 

posted on   ᶜʸᵃⁿ  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示