链接:870. 优势洗牌 - 力扣(LeetCode)
解答来自 力扣用户 灵茶山艾府
田忌赛马(Python/Java/C++/Go) - 优势洗牌 - 力扣(LeetCode)
Python:
class Solution:
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
n = len(nums1)
ans = [0] * n #初始化一个长度为n的数组
nums1.sort()
ids = sorted(range(n), key=lambda i: nums2[i])
left, right = 0, n - 1
for x in nums1:
if x > nums2[ids[left]]:
ans[ids[left]] = x # 用下等马赢下等马
left += 1
else:
ans[ids[right]] = x # 用下等马消耗上等马
right -= 1
return ans
C++:
class Solution {
public:
vector<int> advantageCount(vector<int> &nums1, vector<int> &nums2) {
int n = nums1.size(), ids[n];
vector<int> ans(n);
sort(nums1.begin(), nums1.end());
iota(ids, ids + n, 0); // 给定 地址范围,和 初值,给这个范围赋值,步长为1
//sort(起始地址,结束地址,比较器cmp) 。给 nums2 的索引 按 nums2元素的大小从小到大排序
//[&](int i, int j) { return nums2[i] < nums2[j]; } 是lambda 形式的cmp。< 则为升序
sort(ids, ids + n, [&](int i, int j) { return nums2[i] < nums2[j]; });
int left = 0, right = n - 1;
for (int x : nums1) // vector遍历
ans[x > nums2[ids[left]] ? ids[left++] : ids[right--]] = x;
return ans;
}
};
iota()函数的原型
template <class ForwardIterator, class T>
void iota (ForwardIterator first, ForwardIterator last, T val)
{
while (first!=last) {
*first = val;
++first;
++val;
}
}
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!