zoukankan      html  css  js  c++  java
  • [LeetCode] 1122. Relative Sort Array

    Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all elements in arr2 are also in arr1.

    Sort the elements of arr1 such that the relative ordering of items in arr1 are the same as in arr2.  Elements that don't appear in arr2 should be placed at the end of arr1 in ascending order.

    Example 1:

    Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
    Output: [2,2,2,1,4,3,3,9,6,7,19]

    Constraints:

    • arr1.length, arr2.length <= 1000
    • 0 <= arr1[i], arr2[i] <= 1000
    • Each arr2[i] is distinct.
    • Each arr2[i] is in arr1.

    数组的相对排序。题意是给两个数组arr1和arr2,arr1较长,有重复元素;arr2较短,没有重复元素;arr2中所有元素都在arr1中出现。请对arr1中的元素进行排序,使arr1中所有元素的相对顺序和arr2中的相对顺序相同。未在arr2中出现过的元素需要按照升序放在arr1的末尾。注意有一个限制条件是数组长度不超过1000。

    思路是用counting sort(计数排序)做,用一个长度为1001(Java需要定义长度)的数组(bucket)记录每个数字在arr1中出现的次数,然后根据数字在arr2中出现与否来改动arr1,使得在arr2中有的数字在arr1中能按照他们的相对顺序重新排列;再次扫描bucket,把arr1中有但是arr2中没有的元素添加到arr1的末端。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int[] relativeSortArray(int[] arr1, int[] arr2) {
     3         int[] count = new int[1001];
     4         for (int n : arr1) {
     5             count[n]++;
     6         }
     7         int i = 0;
     8         for (int n : arr2) {
     9             while (count[n]-- > 0) {
    10                 arr1[i++] = n;
    11             }
    12         }
    13         for (int n = 0; n < count.length; n++) {
    14             while (count[n]-- > 0) {
    15                 arr1[i++] = n;
    16             }
    17         }
    18         return arr1;
    19     }
    20 }

    JavaScript实现

     1 /**
     2  * @param {number[]} arr1
     3  * @param {number[]} arr2
     4  * @return {number[]}
     5  */
     6 var relativeSortArray = function (arr1, arr2) {
     7     let bucket = {};
     8     let res = [];
     9     for (let i = 0; i < arr1.length; i++) {
    10         if (bucket[arr1[i]]) {
    11             bucket[arr1[i]]++;
    12         } else {
    13             bucket[arr1[i]] = 1;
    14         }
    15     }
    16     for (let j = 0; j < arr2.length; j++) {
    17         while (bucket[arr2[j]]) {
    18             res.push(arr2[j]);
    19             bucket[arr2[j]]--;
    20         }
    21     }
    22     for (let key in bucket) {
    23         while (bucket[key]) {
    24             res.push(key);
    25             bucket[key]--;
    26         }
    27     }
    28     return res;
    29 };

    LeetCode 题目总结

  • 相关阅读:
    python3.7.6安装爬虫akshare
    linux执行crotab是python脚本不生效解决方案
    centos7安装smb共享目录
    搜索引擎集群安装7.8-head-ik
    npm更换阿里源
    nginx访问静态文件不下载,修改默认流下载
    jenkins通过证书ssh访问代码解决方法
    redis创建密码
    微信二次分享时缩略图及描述信息丢失
    redis安装使用
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12462225.html
Copyright © 2011-2022 走看看