• 数组的相对排序


    这道题出自LeetCode,题目如下:

    给你两个数组,arr1arr2

    • 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.length, arr2.length <= 1000
    0 <= arr1[i], arr2[i] <= 1000
    arr2 中的元素 arr2[i] 各不相同
    arr2 中的每个元素 arr2[i] 都出现在 arr1

    这道题的意思很简单,就是在数组arr1中依次寻找数组arr2中的元素,根据每个元素出现的次数,放入的结果数组中,最后将arr1剩余的元素进行排序之后添加到结果中去即可。

    注意到题目的假设,即数组元素的大小是有范围的,且不超过1000,这种情况下我们可以利用计数排序来解决这个问题。通过遍历arr1,我们知道每个元素出现的次数,将其记录到对应位置的计数数组中去,然后再遍历arr2,就可以立刻查找出每个元素出现的次数。这时我们需要根据查找过的元素,清理计数数组,以便和没有出现在arr2中的元素进行区分。然后再次遍历arr1,由于是计数数组,所以自然就是有序的,这样就可以直接得到结果。最后通过的代码如下:

    class Solution {
    public:
        vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
            int min = *min_element(arr1.begin(), arr1.end());
            int max = *max_element(arr1.begin(), arr1.end());
    
            int len = max - min + 1;
    
            vector<int> frequency(len);
            for(auto n : arr1)
            {
                ++frequency[n - min];
            }
    
            vector<int> res;
    
            for(auto n : arr2)
            {
                for(int i = 0; i < frequency[n - min]; ++i)
                {
                    res.push_back(n);
                }
                frequency[n - min] = 0;
            }
    
            for(int i = 0; i < frequency.size(); ++i)
            {
                for(int j = 0; j < frequency[i]; ++j)
                {
                    res.push_back(i + min);
                }
            }
    
            return res;
        }
    };
    
  • 相关阅读:
    Ambient Intelligence in Networked Society
    如何定位问题及如何区分前后端BUG
    接口测试-结合Postman的使用
    Selenium的PageObject设计模式(2)
    Selenium的PageObject设计模式(1)
    Git+Pycharm 分布式版本管理
    php中不用内置函数实现字符串转整形
    mysql中case使用
    快速排序
    魔术方法__sleep(),__wakeup()
  • 原文地址:https://www.cnblogs.com/back-to-the-past/p/14882089.html
Copyright © 2020-2023  润新知