两个顺序排列的数组A和B 求B数组是否为A的子集(数组内肯呢个有重复的数字)?用js实现

发布于 2022-09-04 13:35:55 字数 51 浏览 8 评论 0

两个顺序排列的数组A和B 求B数组是否为A的子集(数组内肯呢个有重复的数字)?用js实现

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

始终不够 2022-09-11 13:35:55

写了一个,不过没有仔细测过。。。

好处就是和用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;
}
带刺的爱情 2022-09-11 13:35:55
function subset(A,B){
  A = A.slice();
  for(var i=0, len=B.length; i<len; i++){
    if(A.indexOf(B[i]) === -1){
       return false;
    }else{
      A.splice(A.indexOf(B[i]),1);
    }
  }
  return true;
}
蓝色星空 2022-09-11 13:35:55
function z(a, b) {
  var arr = [].concat(a);
  var index = -1;
  for(var i = 0; i < b.length; i++) {
     index = arr.indexOf(b[i]);
     if(arr.indexOf(b[i]) === -1) {
        return false
     }
     arr.splice(index, 1);
  }
  return true
}

看B是否是A的子集: z(A, B)

返回true就是,否则false不是

梦巷 2022-09-11 13:35:55
    //O(n)

    function isSubset(A, B) {
        let set = {};
        let res = 0;
        for (let i = 0; i < A.length; i++) {
            set['A' + A[i]] = 1;
            if (B[i]) {
                set['B' + B[i]] = set['B' + B[i]] ? set['B' + B[i]] + 1 : 1;
                res += 1;
                if (set['A' + B[i]]) {
                    res -= 1;
                    set['A' + B[i]] = 0;
                    set['B' + B[i]] -= 1;
                }
            }
            if (set['B' + A[i]]) {
                res -= 1;
                set['A' + A[i]] = 0;
                set['B' + A[i]] -= 1;
            }
        }
        return !res
    }
    
    console.log(isSubset([2, 1, 5, 3, 3, 3, 1], [1, 1, 2, 3, 3, 5]))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文