【贪心】优势洗牌

【贪心】优势洗牌_第1张图片


/**  类似于田忌赛马,nums1是田忌的马,nums1是齐威王的马
 * 贪心:先对两个数组排序,然后比较这两个数组的首位元素,nums1大于nums2的
 *        首位元素,将其对应其对应起来。否则将nums1的首个元素和nums中最大值对应。
 */
public class L870 {
    public static void main(String[] args) {
        int[] nums1 = new int[]{2, 7, 11, 15};
        int[] nums12 = new int[]{1, 10, 4, 11};
        advantageCount(nums1, nums12);
    }

    public static int[] advantageCount(int[] nums1, int[] nums2) {
        int n = nums1.length;
        Integer[] idx1 = new Integer[n];
        Integer[] idx2 = new Integer[n];
        for (int i = 0; i < n; i++) {
            idx1[i] = i;
            idx2[i] = i;
        }
        //因为不能改变原数组次序,所以创建下标数组idx1、idx2。对下标数组排序
        //即idx1[0]对应nums1中最小的数,idx1[1]对应nums1中第二小的数,以此类推。
        Arrays.sort(idx1, (a, b) -> nums1[a] - nums1[b]);
        Arrays.sort(idx2, (a, b) -> nums2[a] - nums2[b]);
        int[] ans = new int[n];
        int left = 0, right = n - 1;
        for (int i = 0; i < n; i++) {
            if (nums1[idx1[i]] > nums2[idx2[left]]) {
                ans[idx2[left]] = nums1[idx1[i]];
                left++;
            } else {
                ans[idx2[right]] = nums1[idx1[i]];
                right--;
            }
        }
        return ans;
    }
}

你可能感兴趣的:(刷题笔记,算法,java,数据结构)