Skip to content

Latest commit

 

History

History
163 lines (129 loc) · 4.07 KB

File metadata and controls

163 lines (129 loc) · 4.07 KB

English Version

题目描述

给你两个数组,arr1 和 arr2arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。

arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

 

示例 1:

输入: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]

示例  2:

输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]

 

提示:

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

解法

由于本题数据范围是 [0, 1000],因此我们可以开辟一个长度为 1001 的数组 mp,记录 arr1 的元素以及出现的次数。

接着,遍历 arr2 中每个元素 x,若 mp[x] 大于 0,循环将 x 加入到答案数组 arr1 中,并且递减 mp[x]。遍历结束后,再从下标 j = 0 开始遍历 mp,若遇到 mp[j] 大于 0,将 mp[j] 个 j 加入到答案数组 arr1 中。

最后返回 arr1 即可。

Python3

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        mp = {num: i for i, num in enumerate(arr2)}
        arr1.sort(key=lambda x: (mp.get(x, 10000), x))
        return arr1
class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        mp = [0] * 1001
        for x in arr1:
            mp[x] += 1
        i = 0
        for x in arr2:
            while mp[x] > 0:
                arr1[i] = x
                mp[x] -= 1
                i += 1
        for x, cnt in enumerate(mp):
            for _ in range(cnt):
                arr1[i] = x
                i += 1
        return arr1

Java

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int[] mp = new int[1001];
        for (int x : arr1) {
            ++mp[x];
        }
        int i = 0;
        for (int x : arr2) {
            while (mp[x]-- > 0) {
                arr1[i++] = x;
            }
        }
        for (int j = 0; j < mp.length; ++j) {
            while (mp[j]-- > 0) {
                arr1[i++] = j;
            }
        }
        return arr1;
    }
}

C++

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        vector<int> mp(1001);
        for (int x : arr1) ++mp[x];
        int i = 0;
        for (int x : arr2) {
            while (mp[x]-- > 0) arr1[i++] = x;
        }
        for (int j = 0; j < mp.size(); ++j) {
            while (mp[j]-- > 0) arr1[i++] = j;
        }
        return arr1;
    }
};

Go

func relativeSortArray(arr1 []int, arr2 []int) []int {
	mp := make([]int, 1001)
	for _, x := range arr1 {
		mp[x]++
	}
	i := 0
	for _, x := range arr2 {
		for mp[x] > 0 {
			arr1[i] = x
			mp[x]--
			i++
		}
	}
	for j, cnt := range mp {
		for cnt > 0 {
			arr1[i] = j
			i++
			cnt--
		}
	}
	return arr1
}

...