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;
    }
};
``
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值