• 870. 优势洗牌


     

    labuladong 题解思路
    难度中等

    给定两个大小相等的数组 nums1 和 nums2nums1 相对于 nums 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。

    返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。

    示例 1:

    输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
    输出:[2,11,7,15]
    

    示例 2:

    输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
    输出:[24,32,8,12]
    

    提示:

    • 1 <= nums1.length <= 105
    • nums2.length == nums1.length
    • 0 <= nums1[i], nums2[i] <= 109
    class Solution {
    public:
        vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
            int n = nums1.size();
            vector<int> ord(n,0);
            vector<int> res(n,0);
            for(int i = 0; i < n;i++) ord[i] = i;
            sort(ord.begin(),ord.end(),[&](int a, int b){
                return nums2[a] > nums2[b];
            });
            sort(nums1.rbegin(),nums1.rend());
            int l=0,r=n-1;
            for(auto idx:ord) {
                res[idx] = nums1[l]>nums2[idx]?nums1[l++]:nums1[r--]; 
            }
            return res;
        }
    };

    错误解法:用 map 存结果可能会有重复元素。所以应该是按照值排序,然后得到下标的序。

    class Solution {
    public:
        vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
            unordered_map<int,int> val2index;
            vector<int> nums2_bak = nums2;
            
            unordered_map<int,int> val2res;
            sort(nums2.rbegin(),nums2.rend());
            sort(nums1.rbegin(),nums1.rend());
            int left = 0;
            int end = nums2.size() -1;
            for(int i = 0; i < nums2.size();i++) {
                if (nums1[left]>nums2[i]) {
                    val2res[nums2[i]] = nums1[left];
                    left++;
                } else {
                    val2res[nums2[i]] = nums1[end];
                    end--;
                }
            }
            vector<int> res;
            for (auto n2:nums2_bak) {
                int a = val2res[n2];
                res.emplace_back(a);
            }
            return res;
        }
    
    };
  • 相关阅读:
    WinForm的Chart控件画条形图
    WinForm的Chart控件画折线图
    自定义控件
    左侧收缩菜单
    数组
    C#生成随机数的三种方法
    WinForm之GDI手动双缓冲技术
    WinForm之GDI画图步骤
    WinForm GDI编程:Graphics画布类
    翻译:《实用的Python编程》08_02_Logging
  • 原文地址:https://www.cnblogs.com/zle1992/p/16626297.html
Copyright © 2020-2023  润新知