LeetCode 870 优势洗牌

该博客介绍了如何解决LeetCode的第870题——优势洗牌。通过贪心算法,对数组A和B进行排序,并在B数组上进行操作,以使A相对于B的优势最大化。算法首先对A排序,然后对B数组的序号进行排序,接着使用双指针策略,将A中的元素尽可能地与B中较小的元素匹配。时间复杂度为O(NlogN),空间复杂度为O(N)。博客提供了C++和Golang两种语言的实现代码。
摘要由CSDN通过智能技术生成

LeetCode 870 优势洗牌

1.题目描述:

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。

示例 1:

输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]

2.题解:

方法:贪心算法

  1. 对A,B数组从小到大排序,对B数组仅使用下标排序,不能破坏原始顺序
  2. 在B数组上定义,l, r ,初始时 l = 0,r = n-1。如果A[i] > B序号最小的数, 就这样安排,否则,就将A安排B中最大的数。
  3. 贪心的正确性是 A 中的每个数字都要尽可能的干掉 B 中的一个数字,如果干不掉,则消耗掉 B 中剩余最大的数字。

时间复杂度:O(N log N);
空间复杂度:O (N)。

C++:

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size() ;
        sort(nums1.begin(), nums1.end());
        vector<int>id(n) ;
        // 对nums2数组 进行序号排序
        for (int i =0 ;i < n ;i++) id[i] = i ;
        sort(id.begin(), id.end(), [&](int a, int b) {
            return nums2[a] < nums2[b] ;
        }) ;
        vector<int> res(n) ;
        int  l =0 , r = n-1 ;
        for (auto x : nums1) {
            if (x > nums2[id[l]]) res[id[l++]] = x ; 
            else res[id[r--]] = x ;
        }
        return res ;
    }
};

Golang:

type value_index struct {
    value int
    index int
}
func advantageCount(A []int, B []int) []int {
    sort.Ints(A)
    n := len(A)
    b_val_idx := make([]value_index, n)
    for i, val := range B {
        b_val_idx[i].value = val
        b_val_idx[i].index = i
    }
    sort.Slice(b_val_idx[:], func(i, j int) bool{
        return b_val_idx[i].value > b_val_idx[j].value
    })
    lo, hi := 0, n-1
    res := make([]int, n)
    for _, v := range b_val_idx {
        idx, val := v.index, v.value
        if A[hi] > val {
            res[idx] = A[hi]
            hi--
        } else {
            res[idx] = A[lo]
            lo++
        }
    }
    return res
}

原题:优势洗牌

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的波吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值