leetcode 870 優勢洗牌

2021-10-10 08:52:53 字數 1238 閱讀 5453

題目描述:給定兩個大小相等的陣列 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 ...