【Leetcode】870. 優勢洗牌
阿新 • • 發佈:2019-01-13
給定兩個大小相等的陣列 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
基本思路:先將A,B排序,運用貪心思想,tmp依次儲存排序後A對B的優勢最大化陣列。
流程:遍歷A陣列,找到最小滿足A【i】>B【j】的A【i】值儲存在tmp中,不滿足的值直接放在tmp末端,然後通過二重for迴圈對之前的B陣列進行對映還原。
之前的錯誤思路:
還是先排序,想通過map直接記錄B中對應的A值,然後發現重複值無法處理,而且產生了空指標錯誤(這個還不清楚為什麼)
AC程式碼:
class Solution { public int[] advantageCount(int[] A, int[] B) { Arrays.sort(A); int []d=B.clone(); Arrays.sort(d); int len =A.length,j=A.length-1,k=0; int []ans=new int[len]; int []tmp=new int[len]; for(int i=0;i<len;i++){ if(A[i]>d[k]) //找到最小滿足條件的A[] { tmp[k]=A[i]; k++; } else{ tmp[j]=A[i]; j--; } } for(int i=0;i<len;i++){ for(j=0;j<len;j++){ if(B[i]==d[j]){ ans[i]=tmp[j]; d[j]=-1; //處理重複值 break; } } } return ans; } }