870 優勢洗牌(貪心)

2021-10-04 19:18:16 字數 1370 閱讀 4156

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 = [12,24,8,32], b = [13,25,32,11]

輸出:[24,32,8,12]

1 <= a.length = b.length <= 10000

0 <= a[i] <= 10^9

0 <= b[i] <= 10^9

2. 思路分析:

② 這種題目很經典地讓我們想到使用貪心的策略來做,我們希望使用這樣乙個策略,使得當前a中的元素盡可能大於當前b中的元素,假如當前的a中的元素不大於b中的元素,那麼嘗試a中的下乙個元素與之前的b的元素進行匹配

③ 在官方提供的**中其實還是比較好理解的,使用的就是這樣的貪心策略,很值得學習,它的基本實現方法如下:

1)將a陣列與b陣列轉殖出來,因為在最後的答案生成過程中需要使用到排序之前的陣列,答案是根據之前的b陣列的順序來生成的

2)將轉殖出來的a、b陣列進行排序,排序之後很容易找到ab陣列元素的大小關係,其中使用到了map>資料結構進行對映,鍵為當前b陣列的元素值,值為當前與b陣列進行匹配的a陣列的元素值,為什麼使用雙端佇列呢?因為陣列的元素是有重複的所以可能存在著多個相同的元素(使用佇列也行,只要滿足先進先出的特點就可以),這個時候需要map進行對映的話假如值為普通的資料型別那麼相同的鍵(b中存在相同的元素)的值就可能被覆蓋掉,所以要使用佇列來儲存元素這樣可以避免這個問題

3)使用乙個變數來記錄當前b陣列中匹配的位置,在迴圈中遍歷a陣列,當a陣列的元素大於了b陣列的元素的時候,將當前匹配的元素對映到map中,b陣列匹配的位置往下移動一位,假如不大於那麼加入到另外乙個佇列之中,因為這些元素與b當前的元素是不匹配的,最好再處理這些在佇列中不匹配的元素

4)最後在迴圈中檢查map的對映關係,找到當前元素與b匹配的a中的元素是什麼,遍歷的過程生成排列情況,其實整個過程還是比較好理解的,最好的話借助於debug除錯一下,這樣會更容易理解其中的過程

3. **如下:

官方的**如下:

class solution  else 

}int ans = new int[b.length];

for (int i = 0; i < b.length; ++i)

return ans;

}}

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,32,1...

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 優勢洗牌

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