leetcode 2020周赛189 5414. 收藏清单
给你一个数组 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用户收藏的公司清单(下标从 0 开始)。
请找出不是其他任何人收藏的公司清单的子集的收藏清单,并返回该清单下标。下标需要按升序排列。
输入:favoriteCompanies = [[“leetcode”,“google”,“facebook”],[“google”,“microsoft”],[“google”,“facebook”],[“google”],[“amazon”]]
输出:[0,1,4]
解释:
favoriteCompanies[2]=[“google”,“facebook”] 是 favoriteCompanies[0]=[“leetcode”,“google”,“facebook”] 的子集。
favoriteCompanies[3]=[“google”] 是 favoriteCompanies[0]=[“leetcode”,“google”,“facebook”] 和 favoriteCompanies[1]=[“google”,“microsoft”] 的子集。
其余的收藏清单均不是其他任何人收藏的公司清单的子集,因此,答案为 [0,1,4] 。
输入:favoriteCompanies = [[“leetcode”,“google”,“facebook”],[“leetcode”,“amazon”],[“facebook”,“google”]]
输出:[0,1]
解释:favoriteCompanies[2]=[“facebook”,“google”] 是 favoriteCompanies[0]=[“leetcode”,“google”,“facebook”] 的子集,因此,答案为 [0,1] 。
我的写法比较繁琐,不推荐阅读
题意 : 判断一个set是不是被其他set完全包含
一.
- 判断一个有序vector A是否完全包含 有序vector B (A的长度大于B) ,
两个指指针pA,pB开始都指向A和B的开头元素,
指向元素相同时,一起往下指, pA ++, pB ++
指向元素不相同时,pA往下指, pA ++
当pB越过最后一个元素时,说明A包含B
- 把每个vector<vector<int>>按元素个数排序
暴力判断即可
struct Node {
int id;
vector<string> vec;
bool operator < (const Node& no) const {
return vec.size() > no.vec.size();
}
bool incl(Node& no) { //判断是否包含no
int i, k; //this.vec长度大
for(i=0, k=0; i<no.vec.size() && k<vec.size(); )
if(vec[k] == no.vec[i]) {
i ++, k ++;
} else {
k ++;
}
return i == no.vec.size();
}
};
完整代码
struct Node {
int id;
vector<string> vec;
bool operator < (const Node& no) const {
return vec.size() > no.vec.size();
}
bool incl(Node& no) { //判断是否包含no
int i, k;
for(i=0, k=0; i<no.vec.size() && k<vec.size(); )
if(vec[k] == no.vec[i]) {
i ++, k ++;
} else {
k ++;
}
return i == no.vec.size();
}
};
class Solution {
public:
vector<int> peopleIndexes(vector<vector<string>>& vvi) {
//判断一个set是不是被其他set完全包含
int n = vvi.size();
vector<int> ans;
vector<Node> vec;
for(int i=0; i<n; i++) {
Node no;
sort(vvi[i].begin(), vvi[i].end());
no.vec = vvi[i];
no.id = i;
vec.push_back(no);
}
sort(vec.begin(), vec.end()); //按集合长度排好序,[元素多->元素少]
ans.push_back(vec[0].id); //开头元素最多,一定不被其他包含
for(int i=0; i<n; i++) { //枚举每个集合
// for(int k=0; k<vec[i].vec.size(); k++)
// cout << vec[i].vec[k] << " ";
// cout << endl;
if(!i) continue ;
for(int k=0; k<i; k++) { //暴力判断元素比(当前集合B)多的(集合A)是否内含
if(vec[k].incl(vec[i])) {
// cout << k << " include " << i << endl;
goto notpush; //被其他集合包含,就跳过,判断下一个
}
}
ans.push_back(vec[i].id); //不被其他集合包含,就加入答案
notpush: ;
}
sort(ans.begin(), ans.end());
return ans;
}
};
``