LC1122.数组的相对排序

image.png

思路:改变规则的计数排序

  • 首先统计arr1中各个元素出现的频率,记在数组rec当中
  • 接着,按照arr2中各个元素的出现次序,将该部分元素按照rec数组里面的频率,打印出来,打印之后将频率清零,这样我就知道出现在**arr1**,但是没有出现在**arr2**当中 的所有元素(即频率不为0的元素)。
  • 那么,剩下那一部分(在arr1中,但是不在arr2中的元素们),按照升序,将其全部打印出来即可。

    代码:

    1. class Solution {
    2. public:
    3. vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
    4. int min_num = *min_element(arr1.begin(), arr1.end());
    5. int max_num = *max_element(arr1.begin(), arr1.end()) - min_num;
    6. int n1 = arr1.size(), n2 = arr2.size();
    7. // 计数排序
    8. vector<int> rec(max_num + 5, 0);
    9. for (int i = 0; i < n1; i++) {
    10. rec[arr1[i] - min_num] += 1;
    11. }
    12. vector<int> ans;
    13. for (int i = 0; i < n2; i++) {
    14. for (int k = 0, nr = rec[arr2[i] - min_num]; k < nr; k++) {
    15. ans.push_back(arr2[i]);
    16. rec[arr2[i] - min_num] -= 1;
    17. }
    18. }
    19. for (int i = 0; i <= max_num; i++) {
    20. while (rec[i] > 0) {
    21. ans.push_back(i + min_num);
    22. rec[i] -= 1;
    23. }
    24. }
    25. return ans;
    26. }
    27. };