1. 程式人生 > >【Leetcode】870. 優勢洗牌

【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,32,11]
輸出:[24,32,8,12]

提示:

  1. 1 <= A.length = B.length <= 10000
  2. 0 <= A[i] <= 10^9
  3. 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;
    }
}