两个顺序排列的数组A和B 求B数组是否为A的子集(数组内肯呢个有重复的数字)?用js实现
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;
}
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不是
//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]))
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
1 回答3.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
写了一个,不过没有仔细测过。。。
好处就是和用
indexOf
,splice
相比速度快很多,代码复杂度也小很多。。。代码复杂度:
O(n)
, 空间复杂度:O(1)
非顺序排列数组,我把上面的判断删了,可以酌情加上:
代码复杂度:
O(n+m)
, 空间复杂度:O(m)