亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

兩個順序排列的數組A和B 求B數組是否為A的子集(數組內肯呢個有重復的數字)?用js實現

兩個順序排列的數組A和B 求B數組是否為A的子集(數組內肯呢個有重復的數字)?用js實現

茅侃侃 2018-10-11 10:11:55
兩個順序排列的數組A和B 求B數組是否為A的子集(數組內肯呢個有重復的數字)?用js實現
查看完整描述

1 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

寫了一個,不過沒有仔細測過。。。

好處就是和用indexOf,splice相比速度快很多,代碼復雜度也小很多。。。

代碼復雜度: O(n), 空間復雜度: O(1)

Array.prototype.isSubArrayOf = function(a){

  if(!a || !(a instanceof Array)) return false;


  let b = this;

  let aLength = a.length, bLength = b.length;

  if(aLength < bLength) return false;


  let indexA = 0, indexB = 0;


  while(indexB < bLength && indexA < aLength ) {

    let tempA = a[indexA], tempB = b[indexB];


    if(tempB === tempA) {

      indexA++;

      indexB++;

    } else if(tempB > tempA) {

      indexA++;

    } else {

      return false;

    }

  }


  return indexB === bLength;

}

非順序排列數組,我把上面的判斷刪了,可以酌情加上:

代碼復雜度: O(n+m), 空間復雜度: O(m)

Array.prototype.isSubArrayOf = function(a){

  let b = this, map = {};


  for(let i of b) {

    map[i] = map[i] ? map[i] + 1 : 1;

  }


  for(let i of a) {

    if(map[i]) { 

      map[i] = map[i] - 1;

      if(map[i] === 0) delete map[i];

    }

  }


  return Object.keys(map).length === 0;

}


查看完整回答
反對 回復 2018-11-20
  • 1 回答
  • 0 關注
  • 1119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號