1122.数组的相对排序

题目描述

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


题解

解题思路蛮简单的,按照顺序取arr2中的元素,遍历arr1找到相同的元素,依次换到arr1的前面。arr2遍历结束后,arr1前面的元素就都按照arr2中的顺序排好了,接下来把arr1中剩下的元素(也就是arr2中没出现的元素)按升序排序。排序方法可以是冒泡排序,插入排序等等。我采用的使插入排序。

代码如下:


    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        int index_arr1, index_arr2, i, j;
        int flag,temp;
        for(index_arr2 = 0, index_arr1 = 0; index_arr2 < arr2.size(); index_arr2++)
        {
            flag = arr2[index_arr2];
            for(i = index_arr1; i < arr1.size(); i++)
            {
                if(arr1[i] == flag)
                {
                    temp = arr1[index_arr1];
                    arr1[index_arr1] = arr1[i];
                    arr1[i] = temp;
                    index_arr1++;
                }
            }
        }
        for(i = index_arr1+1; i < arr1.size(); i++)
        {
            if(arr1[i-1] > arr1[i])
            {
                temp = arr1[i];
                for(j = i-1; arr1[j] > temp && j >= index_arr1 ; j--)
                {
                    arr1[j+1] = arr1[j];
                }
                arr1[j+1] = temp;
            }
        }
        return arr1;
    }

结果

虽然简单,但我还是提交了3次,挺菜的【捂脸

问题主要出在后半部分——插入排序

而且问题都是出在这个循环判断条件:

            for(j = i-1; arr1[j] > temp && j >= index_arr1 ; j--)

——————第1次提交的代码——————


    temp = arr1[i-1];
    for(j = i-1; j > index_arr1-1; j--)

我可能是个智障吧【苦笑】,首先temp应该赋值arr1[ i ],arr1[ i ]才是要插入的元素,我也不知道我当时是怎么想的。其次,循环结束条件应该是找到找到比待插入元素小的元素下标,应该是元素和元素的比较而不是下标和下标的比较,所以判断条件应该是 arr1[ j ] > temp。

——————第2次提交的代码——————

    for(j = i-1; arr1[ j ] > temp; j--)

纠正了第1次的错误,样例测试数据也通过了。然而提交结果告诉我下标越界,呵呵……

不通过的测试数据为:arr1 = [26,21,11,20,50,34,1,18],arr2 = [21,11,26,20]

如果按照这次的代码执行的话,当temp = 1时,j会一直自减,当j减小到-1时,下标就越界啦~

所以应该再加上一个判断条件,即:j >= index_arr1,就是说j减小到index_arr1的前一位就不要再减小啦,因为index_arr1之前的元素都是排好的,不能再改变了。

最后po以下结果~~~速度还算可以吧

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容