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.题解:
方法:贪心算法
- 对A,B数组从小到大排序,对B数组仅使用下标排序,不能破坏原始顺序
- 在B数组上定义,l, r ,初始时 l = 0,r = n-1。如果A[i] > B序号最小的数, 就这样安排,否则,就将A安排B中最大的数。
- 贪心的正确性是 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) ;
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
}
|