題目描述:給定兩個大小相等的陣列 a 和 b,a 相對於 b 的優勢可以用滿足 a[i] > b[i] 的索引 i 的數目來描述。
返回 a 的任意排列,使其相對於 b 的優勢最大化。
我的思路:這道題思路蠻好想的,就是每次貪心的找a中最小的大於當前b中元素的元素,聽起來有點繞?那給你四個字:田忌賽馬……是的,這是同乙個問題。但這下就卡在了python的實現上,在c++裡我們有lower-bound和upper-bound,但在python裡我們沒有,所以我們就想到了類似於雙指標的解法。寫了半天發現自己還是太菜了,於是看了官方題解,結果發現題解的思路是不同的!
題解思路:在我的思路中,我們會自然地把a排序,然後遍歷b,對a開乙個指標。但是題解告訴我們,我們可以對a、b同時排序。然後怎麼處理呢?首先,我們開乙個字典,鍵值為b中元素,值為乙個列表。然後我們按位置同時遍歷a 和b,也就是使a、b索引值相同,如果a[i]>b[i],當前a[i]就加入b[i]的列表中,否則,就加入乙個新的待定列表。最後構造答案時,對於b中的每個元素,列表有元素就輸出,沒有就從待定列表中拿。
class
solution
:def
advantagecount
(self, a: list[
int]
, b: list[
int])-
> list[
int]
: a =
sorted
(a) b =
sorted
(b) ans =
rest =
i =0for item in a:
if item > b[i]
: ans[b[i]
] i +=
1else
: res =
for item in b:
if ans[item]
:.pop())
else:)
)return res
考慮這樣貪心為什麼是對的,因為兩個列表都經過排序後,如果a[i]>b[i],則a[i]一定是a中大於b[i]的最小值,這個a[i]也就是我們想要的答案。而如果a[i]<=b[i],那a[i]肯定更小於等於b[i]之後的元素,也就是這個a[i]沒用了。
最後還有一點,可能有人會好奇為啥字典裡的值要是乙個列表,直接是乙個數不是更簡單麼?當然不是,因為b中資料是會有重複的!會重複!
Leetcode 870 優勢洗牌
題目描述 給定兩個大小相等的陣列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 12,24,8,32 b 13,25...
LeetCode 870 優勢洗牌 C語言版
給定兩個大小相等的陣列 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 12,24,8,32 b ...
LeetCode打卡 870 優勢洗牌
給定兩個大小相等的陣列 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 12,24,8,32 b ...