1. 程式人生 > 實用技巧 >「SDOI2016」征途(斜率優化)

「SDOI2016」征途(斜率優化)

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例項的遍歷方法:

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回鍵值對的遍歷器。
  • forEach():遍歷 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;
}

缺點:API 太新,舊瀏覽器不支援。

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]

缺點:API 太新,舊瀏覽器不支援。

借鑑計數排序的原理

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],就會出錯。