uacs2024

导航

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 2024-12-27 19:17  ᶜʸᵃⁿ  阅读(16)  评论(0)    收藏  举报