• 1122:数组的相对顺序(C++)


    题目地址:https://leetcode-cn.com/problems/relative-sort-array/

    题目描述

    给你两个数组,arr1 和 arr2,

    • arr2 中的元素各不相同
    • arr2 中的每个元素都出现在 arr1 中

    对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

    题目示例

    示例:

    输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
    输出:[2,2,2,1,4,3,3,9,6,7,19]

    解题思路

    思路1:冒泡排序。首先分析题目,发现并不需要开辟额外的内存空间,利用arr1的内存空间即可,通过两层for循环,对数组arr2和数组arr1进行比较,如果arr1中的当前元素与arr2的元素相同,则交换arr1中的当前元素到前一位置,如此便可将数组arr2中的每个元素的相对元素都处理完毕,接下来是对数组arr1中的剩余元素进行排序就行。

    思路2:哈希表。看到统计整数次数的题目,第一想法就说哈希表了,没错,就是认准了你啦!我们首先遍历数组arr1,统计每个元素出现的次数,然后遍历数组arr2,根据arr2中每个元素在arr1中出现的次数,将该元素按照出现的次数加入结果集res中,此时,需要注意的是要将哈希表中该元素的相同值从哈希表中删除,否则会造成超时问题,最后将哈希表中未处理的元素加入结果集res中即可,有人会问剩下的元素为啥没有排序呢?回答当然是map是默认升序的噢!而unordered_map则是降序的。

    程序源码

    思路1

    class Solution {
    public:
        vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
            if(arr1.size() == 0 || arr2.size() == 0 || arr1.size() < arr2.size()) return {};
            int cnt = 0;
            for(int i = 0; i < arr2.size(); ++i)
            {
                for(int j = cnt; j < arr1.size(); ++j)
                {
                    if(arr2[i] == arr1[j])
                    {
                        swap(arr1[j], arr1[cnt]); //swap(arr1[j], arr1[cnt++]);
                        ++cnt;
                    }
                }
    
            }
            sort(arr1.begin() + cnt, arr1.end());
            return arr1;
        }
        void swap(int &a, int &b)
        {
            int tmp = b;
            b = a;
            a = tmp;
        }
    };

    思路2

    class Solution {
    public:
        vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
            if(arr1.size() == 0 || arr2.size() == 0 || arr1.size() < arr2.size()) return {};
            map<int, int> mp;
            vector<int> res;
            for(auto num1 : arr1)
            {
                mp[num1]++;
            }
            for(auto num2 : arr2)
            {
                while(mp[num2]--) //mp[nums2]为nums2出现的次数
                {
                    res.push_back(num2);
                }
                mp.erase(num2);//mp删除与num2相同的元素,即去重
            }
           for(map<int, int> ::iterator it = mp.begin(); it != mp.end(); ++it)
           {
               while((it->second)--) //(K,V)
               {
                   res.push_back(it->first);
               }
           } 
           return res;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    hdu_1052 Tian Ji -- The Horse Racing 贪心
    hdu_1050 Moving Tables 贪心
    模拟退火算法-旅行商问题-matlab实现
    主成分分析与逐步回归分析的区别
    二叉树--后序遍历的非递归算法
    表达式求值--数据结构C语言算法实现
    线性表—单链表的创建、查询、插入、删除、合并
    线性表--顺序线性表-基本操作:建表,插入,删除
    String、String[]、ArrayList<String>之间的转换
    Java反射机制概念及使用
  • 原文地址:https://www.cnblogs.com/wzw0625/p/13448322.html
Copyright © 2020-2023  润新知