📂
LeetCode Note
  • Introduction
  • Tools
    • Clean Code
    • 英文小辭典
    • JS Reference
    • 常見 Edge Case
    • Array Method
    • Object Method
    • Function
    • Hashing
    • Prototype
    • 處理 Array 小撇步
    • String Method
    • Math / Date
    • loop
    • JSON.xx / localStorage
    • Date
    • Regex
    • Memorization
    • reduce condition
    • 命名
  • 筆記 Note
    • Promise
    • Walking the DOM
    • Element size and scrolling
    • CSS
  • Leetcode todo
    • ToDo
  • Array
    • # Select random poker without duplicates
    • # 最少替換達成不連續字串
    • # 724 Find Pivot Index
    • # 747. Largest Number At Least Twice of Others
    • # 01 getMaxProfit
    • # maxOfBiggestVal
    • # findSecondLargest
    • # 41 First Missing Positive
    • # 134 Gas Station (有圖)
    • # 202 Happy Number
    • # 344 Reverse String
    • # 412 Fizz Buzz
    • # 561 Array Partition I
    • # 804 Unique Morse Code Words
    • # 905 Sort Array By Parity
    • # 121. Best Time to Buy and Sell Stock.js
    • # 122 Best Time to Buy and Sell Stock II
    • # 189 Rotate Array
    • # 229 Majority Element II
    • # 268 Missing Number.
    • # 299 Bulls and Cows (有圖)
    • # 896 Monotonic Array
    • # 1002 Find Common Characters
    • # 1051 Height Checker
    • # 1185 Day of the Week
    • # 169 Majority Element
    • # 605. Can Place Flowers
    • # 350 Intersection of Two Arrays II (有圖)
    • # 482. License Key Formatting
  • Set / Map
    • # GetLengthOfLongestSubstring
    • #1 Two Sum
    • # 217 Contains Duplicate
    • # 1122 Relative Sort Array
    • # 1160 Find Words That Can Be Formed by Characters
    • #811 Subdomain Visit Count
    • # 349 Intersection of Two Arrays
    • # 819 Most Common Word
  • Two Pointer
    • #704. Binary Search
    • #26 Remove Duplicates from Sorted Array (有圖)
    • #27 Remove Element
    • # 66 Plus One
    • # 80 Remove Duplicates from Sorted Array II (有圖)
    • # 88 Merge Sorted Array (有圖)
    • # 125 Valid Palindrome
    • #167 Two Sum II - Input array is sorted (有圖)
    • # 283 Move Zeroes (有圖)
    • # 38 Count and Say
    • # 557. Reverse Words in a String III
    • #977 Squares of a Sorted Array
    • #209 Minimum Size Subarray Sum
  • String
    • # 13 Roman to Integer (有圖)
    • # 771 Jewels and Stones
    • # 937 Reorder Data in Log Files
    • # 929 Unique Email Addresses
    • # 1108 Defanging an IP Address
    • #14 Longest Common Prefix
    • # 387 First Unique Character in a String (有圖)
    • #193 Valid Phone Numbers
    • # 28 Implement strStr()
    • #383 Ransom Note
  • Stack
    • # 20 Valid Parentheses (有圖)
    • # 155 Min Stack
    • BF 165. remove characters
    • #1047 Remove All Adjacent Duplicates In String
  • Binary Search
    • # 1064 Fixed Point (有圖)
    • # 852 Peak Index in a Mountain Array
  • Recursion 遞迴
    • #2625. Flatten Deeply Nested Array
  • Math
    • # 7 Reverse Integer
    • # 9 Palindrome Number (有圖)
    • #53 Maximum Subarray (有圖)
    • # 1085 Sum of Digits in the Minimum Number.
    • # 136 Single Number
    • # 204 Count Primes (有圖)
    • #243 Shortest Word Distance
  • Dynamic Programing
    • # 322 Coin Change
    • # 509 Fibonacci Number (有圖)
    • # 70 Climbing Stairs
    • # 198 House Robber
    • # 168. Excel Sheet Column Title
  • Others
    • # 205. Isomorphic Strings
    • Implement js Array method
    • Flatten Array/Object
  • Matrix
    • 867. Transpose Matrix
  • Queue
    • DOM tree with queue
  • 排序
    • Different Sort
Powered by GitBook
On this page
  • 怎麼解
  • 改善

Was this helpful?

  1. Set / Map

# 1122 Relative Sort Array

善用 Map 是有排序的特性

Previous# 217 Contains DuplicateNext# 1160 Find Words That Can Be Formed by Characters

Last updated 5 years ago

Was this helpful?

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.

input: 兩個數字 Array,arr 2 的全部包含在 arr 2,arr 裡面是不重覆值
output: 回傳一個大陣列,照著 arr 2 順序排列,arr2 不存在就接在最後
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.

/**
 * @param {number[]} arr1
 * @param {number[]} arr2
 * @return {number[]}
 */
var relativeSortArray = function(arr1, arr2) {
    
};

怎麼解

我一開始是這樣想,兩個陣列都沒排序,我會用 map 先存總共有幾個然後再印出來

var relativeSortArray = function(arr1, arr2) {
  let newMap = new Map();
  let notInArr2 = [];
  let result = [];
  arr2.forEach(item => {
    newMap.set(item, 0)
  })
  arr1.forEach(item => {
    if(newMap.has(item)){
      newMap.set(item, newMap.get(item) + 1)
    }else{
      notInArr2.push(item)
    }
  })
  newMap.forEach((val, key) => {
    for(let i = 0; i< val; i++){
      result.push(key)
    }
  })
 
  return result.concat(notInArr2.sort((a,b)=> a - b))
};

console.log(relativeSortArray([2,3,1,3,2,4,6,7,9,2,19],[2,1,4,3,9,6]))
// faster than 6.09% of JavaScript online submissions

結果速度才 6%,一定有更好解法(也是合理我已經不知道寫了幾個迴圈了)

改善

這題改善解法概念其實一模一樣,只是幾個地方做調整

  • arr1 在一開始先 sort

  • Map 的特性是有順序的,所以善用這個特性,arr2 在一開始就存進去所以 map 會照這個順序走

  • 把 notInArr2 拿掉,可以一起存進 newMap,而且因為 arr1 排序過所以他自然會被放在後面

var relativeSortArray = function(arr1, arr2) {
  let newMap = new Map();
  let result = [];

  arr1.sort( (a, b) => a - b );

  
  arr2.forEach(item => {
    newMap.set(item, 0)
  })
  
  arr1.forEach(item => {
    if(newMap.has(item)){
      newMap.set(item, newMap.get(item) + 1)
    }else{
      newMap.set(item, 1)
    }
  })


  newMap.forEach((val, key) => {
    for(let i = 0; i< val; i++){
      result.push(key)
    }
  })
 
  return result;
};

console.log(relativeSortArray([2,3,1,3,2,4,6,7,9,2,19],[2,1,4,3,9,6]))
// faster than 81.21% of JavaScript online submissions
LeetCode