Leetcode 870 Advantage Shuffle

Leetcode 870:优势洗牌算法题解

题意

给定全部由数字组成的数组nums1和nums2,求nums1的一个组合,使得nums1中的每一个数字都尽量比nums2中的字符大。

题目链接

https://leetcode.com/problems/advantage-shuffle/description/

题解

这题是田忌赛马的n维版本。首先会想到给nums1和nums2排序,对每一位进行比较
如果nums1的值能赢,那就这一位就是nums1,如果赢不了,那这一位就是nums1中最小的值,来送人头。
但由于我无法打乱nums2的顺序,可以用大顶堆来记录当前值和下标的关系

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end(), greater<>());
        priority_queue<pair<int, int>, vector<pair<int,int>>> q;
        vector<int> ret;
        ret.resize(nums1.size());
        int left = 0;
        int right = nums1.size()-1;
    
        for(int i = 0; i < nums2.size();i++) {
            q.push({nums2[i], i});
        }
        while(q.size()) {
            auto [x,y] = q.top();
           
            q.pop();
            if(nums1[left] > x) {
                ret[y] = nums1[left];
                left++;
            } else {
                ret[y] = nums1[right];
                right--;
            }
        }
        return ret;
    }
};

时间复杂度:O(nlogn)O(nlogn)O(nlogn)
空间复杂度:O(n)O(n)O(n)h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值