letecode 编程学习(8)

题目:

给你两个数组,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]
 

提示:

arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中

解题思路:

思路一,通过hash表创建arr2中每一个值和其索引的映射, 然后利用这个映射表对arr1进行排序。

思路二,给予arr1的值的大小有限,可以对arry1弄一个计数表, 然后遍历arr2,就可以保证在arr2中出现的元素按所需的顺序排列,没有出现的给予前面的计数表采用计数排序。

方案一的代码 0.0版本

struct SearchData
    {
        int index;
        int val;
    };
    
    bool compare(const SearchData &a, const SearchData &b)
    {
        if (a.index < b.index)
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
class Solution {
public:
    unordered_map<int, int> _mp;
    

    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        for (int i= 0; i < arr2.size(); i++)
        {
            _mp[arr2[i]] = i;
        }

        std::vector<SearchData> _search_datas(arr1.size());
        for (int j = 0; j < arr1.size(); j++)
        {
            SearchData tmp;
            if (_mp.find(arr1[j]) != _mp.end())
            {
                tmp.index = _mp[arr1[j]];
                tmp.val = arr1[j];
            }
            else
            {
                tmp.index = arr1.size() + 1 +  arr1[j];
                tmp.val = arr1[j];
            } 
            _search_datas[j] = tmp;
        }

        sort(_search_datas.begin(), _search_datas.end(), compare);

        std::vector<int> res(arr1.size());

        for (int i = 0; i < arr1.size(); i++)
        {
           res[i] =  _search_datas[i].val;
        }
        return res;
    }
};

这个版本比较朴素,但是还需要额外申请了空间去存储_serach_data和返回值res。

尝试修改一下变成1.0版本


class Solution {
public:
    unordered_map<int, int> _mp;
    

    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        for (int i= 0; i < arr2.size(); i++)
        {
            _mp[arr2[i]] = i;
        }

        sort(arr1.begin(), arr1.end(), [&](int x, int y){
               if (_mp.count(x))
               {
                 
                return _mp.count(y)? _mp[x] < _mp[y]:true;
               }
               else
                {
                 return _mp.count(y)? false:x < y;
                }
            }
           );
      
      return arry1;
    }
};

第二种方案:


class Solution {
public:
    
    

    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {

           int max_value = *max_elements(arr1.begin(), arr2.end());

           std::vector<int> fs(max_value + 1, 0);
           
           for (int i = 0; i < arr1.size(); i++)
           {
              fs[arr1[i]]++;
            }
            std::vector<int> res;
            res.reserve(arr1.size());
             
            for (int i = 0; i < arr2.size(); i++)
            {
                for(int j = 0; j < fs[arr2[i]]; j++)
                {
                     res.push_back(arr2[i]);
                }
                
                fs[arr2[i]] = 0;
            }

            for (int i = 0; i < fs.size(); i++)
            {
               for(int j = 0; j < fs[i] ;j++)
                {
                  res.push_back(i);
                } 
            }
            return res;

        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值