【LeetCode】 870. Avantage Shuffle

870. Mélange d'avantages

Insérer la description de l'image ici
Insérer la description de l'image ici
Insérer la description de l'image ici

Méthode : gourmande

Idées

  • L'idée de cette question est similaire à "Les courses de chevaux de Tian Ji". Traitez nums1 comme le cheval de Tian Ji et nums2 comme le cheval du roi Qi Wei.

  • Discutez du cheval inférieur de Tian Ji (valeur minimale de nums1) :

    • S'il peut se comparer au cheval inférieur du roi Qi Wei (la valeur minimale de nums2), alors Tian Ji remportera ce point directement ;
    • S'il ne peut pas correspondre au cheval de qualité inférieure du roi Qi Wei, utilisez le cheval de qualité inférieure de Tian Ji pour comparer avec le cheval de qualité supérieure du roi Qi Wei (la valeur maximale de nums2).
  • En supprimant ces deux chevaux, le problème devient un sous-problème plus petit (n-1). En répétant le processus ci-dessus, les relations correspondantes de tous les chevaux sont obtenues.

  • Lorsque le code est implémenté, nums1 est trié directement. Puisque nous devrons utiliser l'indice de nums2 plus tard, nums2 ne peut pas être trié directement. Au lieu de cela, utilisez multiset pour enregistrer la valeur et l'indice de nums2. En même temps, cette structure de données triera automatiquement nums2 (de petit à grand) et autorisera les valeurs en double.

  • Remarque : Utilisation de la fonction d'effacement

    void erase ( iterator position ), son paramètre ne peut être qu'un itérateur avant. J'ai initialement utilisé rbegin() pour supprimer la dernière valeur, et le type de rbegin est reverse_iterator, donc j'ai continué à recevoir des erreurs.

code

class Solution {
    
    
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
    
    
        // 创建一个答案数组
        vector<int> ans(nums1.size());
        // 先将nums1重新排序
        sort(nums1.begin(), nums1.end());
        // 创建一个多重映射,从小到大保存nums2的值及其下标
        // 这里需要使用multimap,因为nums2中可能存在重复的值
        multimap<int, int> mp;
        for(int i=0; i<nums2.size(); ++i){
    
    
            mp.insert({
    
    nums2[i], i});
        }
        for(int i=0; i<nums1.size(); ++i){
    
    
            // "田忌赛马" 如果nums1的最小值大于nums2的最小值,就以此赢他
            if(nums1[i] > mp.begin()->first){
    
    
                ans[mp.begin()->second] = nums1[i];
                mp.erase(mp.begin());
            }
            // 否则就用nums1的最小值和nums2的最大值相比
            else{
    
    
                ans[mp.rbegin()->second] = nums1[i];
                mp.erase(--mp.end());
            } 
        }
        return ans;
    }
};

les références

  1. Courses de chevaux Tian Ji (Python/Java/C++/Go)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43894455/article/details/132184938
conseillé
Classement