vec_1.insert(vec_1.end(), vec_2.begin(), vec_2.end());两个容器的拼接!!
1、我的思路
- 申请容器vector1
- 遍历第一个数组,剔除不属于第二个数组的元素,放在容器vector1,然后升序排列
- 申请辅助空间vector2
- 遍历第一个数组,然后依次将元素放入辅助空间,再和vector1拼接
- 自己都觉得浪费空间和时间
2、看别人思路
计数排序思想
- 求出第一个数组中最大值,为申请的辅助空间大小做准备!
- 创建vector,varr,装对应位置变量出现的次数。vector<int> varr(maxnum+1,0);//初始化
- 删除第一个数组中的所有元素,然后把varr中的变量按照是否出现在第二个数组,装进第一个数组中,然后把变量置零。剩下的都是未出现的元素!!
- 然后把未出现的数加到第一个数组中,完成排列!
3、代码
1 //自己的想法 2 class Solution { 3 public: 4 vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) { 5 //建立一个容器,把不属于第二个数组找出来,然后放入容器中,进行升序排列 6 vector<int>remove; 7 for(int i=0;i<arr1.size();i++){ 8 int cout=0; 9 for(int j=0;j<arr2.size();j++){ 10 if(arr1[i]==arr2[j]) cout++; 11 } 12 if(cout==0) remove.push_back(arr1[i]); 13 } 14 sort(remove.begin(),remove.end());//把剩下的元素按升序排列 15 //建立一个容器;计算每一个元素出现的次数 ;新容器中按顺序存放元素 16 vector<int>num; 17 for(int i=0;i<arr2.size();i++){ 18 int count=0; 19 for(int j=0;j<arr1.size();j++){ 20 if(arr2[i]==arr1[j]) count++; 21 } 22 for(int k=0;k<count;k++){ 23 num.push_back(arr2[i]); 24 } 25 } 26 //拼接两个容器 27 num.insert(num.end(),remove.begin(),remove.end()); 28 return num; 29 } 30 };
1 //看了一位答主的答案 2 class Solution { 3 public: 4 vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) { 5 int maxnum=0; 6 // 步骤1:找出arr1中的最大值 7 for( int i=0; i<arr1.size(); i++ ) 8 { 9 if( maxnum < arr1[i] ) 10 maxnum = arr1[i]; 11 } 12 // 步骤2:建立arr1中数字和出现次数的vector变量 13 vector<int> varr(maxnum+1,0); 14 for( int i=0; i<arr1.size(); i++ ) 15 { 16 varr[arr1[i]]++; 17 } 18 arr1.clear(); 19 // 步骤3:添加arr2中元素 20 for( int i=0; i<arr2.size(); i++ ) 21 { 22 for( int j=0; j<varr[arr2[i]]; j++ ) 23 arr1.push_back(arr2[i]); 24 varr[arr2[i]] = 0; 25 } 26 // 步骤4:添加arr2中未出现过的元素 27 for( int i=0; i<maxnum+1; i++ ) 28 { 29 for( int j=0; j<varr[i]; j++ ) 30 arr1.push_back(i); 31 } 32 return arr1; 33 } 34 };