「SDOI2016」征途(斜率優化)
阿新 • • 發佈:2020-08-10
Map基礎梳理
JavaScript 的物件(Object),本質上是鍵值對的集合(Hash 結構),但是傳統上只能用字串當作鍵。這給它的使用帶來了很大的限制。為了解決這個問題,ES6 提供了 Map
資料結構。它類似於物件,也是鍵值對的集合,但是“鍵”的範圍不限於字串,各種型別的值(包括物件)都可以當作鍵。也就是說,Object
結構提供了“字串—值”的對應,Map
結構提供了“值—值”的對應,是一種更完善的 Hash 結構實現。
例如Map建構函式接受一個數組作為其引數:
const map = new Map([ [1, '網通'], [2, '電信'] ]); // 0:{1 => "網通"} // 1:{2 => "電信"}
Map
例項的屬性和操作方法:
size
:返回成員總數set(key, value)
:新增新的鍵值get(key)
:讀取鍵對應的值has(key)
:是否有某個鍵delete(key)
:刪除某個鍵clear()
:清空
Map
例項的遍歷方法:
陣列去重(Map):
去重前:[1,5,2,3,4,2,3,1,3,4]
去重後:[1,5,2,3,4]
主要思路:建立一個空Map
,遍歷原始陣列,把陣列的每一個元素作為key
存到Map中,因為Map
key
值,所以最終得到的Map
中的所有key
值就是去重後的結果。
function unique(arr) { let hashMap = new Map(); let result = new Array(); // 陣列用於返回結果 for (let i = 0; i < arr.length; i++) { if(hashMap.has(arr[i])) { // 判斷 hashMap 中是否已有該 key 值 hashMap.set(arr[i], true); // 後面的true 代表該 key 值在原始陣列中重複了,false反之 } else { // 如果 hashMap 中沒有該 key 值,新增 hashMap.set(arr[i], false); result.push(arr[i]); } } return result; } let arr = [1,5,2,3,4,2,3,1,3,4]; console.log(unique(arr)); // [1,5,2,3,4] ************************************************************** unique = (array) => { let map = new Map(); let result = [] for (let i = 0; i < array.length; i++) { if(map.has(array[i])) { // 判斷 map 中是否已有該 key continue } else { // 如果 map 中沒有該 key,就加入 result 中 map.set(array[i], true); result.push(array[i]); } } return result; }
Set:程式碼最少
function unique (arr) {
return Array.from(new Set(arr))
}
let arr = [1,5,2,3,4,2,3,1,3,4];
console.log(unique(arr))
//[1,5,2,3,4]
let arr = [1,5,2,3,4,2,3,1,3,4];
[...new Set(arr)]
//[1,5,2,3,4]
借鑑計數排序的原理
unique = (array) => {
const hash = []
for(let i=0;i<array.length; i++){
hash[array[i]] = true
}
const result = []
for(let k in hash){
result.push(k)
}
return result
}
缺點:只支援數字或者字串陣列,如果數組裡面有物件,比如 array = [{number:1}, 2]
,就會出錯。