力扣周賽 1452. 收藏清單

給你一個數組 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用戶收藏的公司清單(下標從 0 開始)。

請找出不是其他任何人收藏的公司清單的子集的收藏清單,並返回該清單下標。下標需要按升序排列。

 

示例 1:

輸入: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] 。
示例 2:

輸入:favoriteCompanies = [["leetcode","google","facebook"],["leetcode","amazon"],["facebook","google"]]
輸出:[0,1] 
解釋:favoriteCompanies[2]=["facebook","google"] 是 favoriteCompanies[0]=["leetcode","google","facebook"] 的子集,因此,答案爲 [0,1] 。
示例 3:

輸入:favoriteCompanies = [["leetcode"],["google"],["facebook"],["amazon"]]
輸出:[0,1,2,3]
 

提示:

1 <= favoriteCompanies.length <= 100
1 <= favoriteCompanies[i].length <= 500
1 <= favoriteCompanies[i][j].length <= 20
favoriteCompanies[i] 中的所有字符串 各不相同 。
用戶收藏的公司清單也 各不相同 ,也就是說,即便我們按字母順序排序每個清單, favoriteCompanies[i] != favoriteCompanies[j] 仍然成立。
所有字符串僅包含小寫英文字母。

 

代碼一:

map<string,int>m[105];
class Solution {
public:
    vector<int> peopleIndexes(vector<vector<string>>& favoriteCompanies) {
        vector<int>ans;
        for(int i=0;i<favoriteCompanies.size();i++)
        {
            m[i].clear();
            for(int j=0;j<favoriteCompanies[i].size();j++)m[i][favoriteCompanies[i][j]]=1;
        }
        for(int i=0;i<favoriteCompanies.size();i++)
        {
            bool flag=true;
            for(int j=0;flag && (j<favoriteCompanies.size());j++)
            {
                if(j==i)continue;
                if(favoriteCompanies[i].size()>favoriteCompanies[j].size())continue;
                bool flag2=true;
                for(int ii=0;flag2 && (ii<favoriteCompanies[i].size());ii++)if(!m[j][favoriteCompanies[i][ii]])flag2=false;
                if(flag2)flag=false;
            }
            if(flag)ans.insert(ans.end(),i);
        }
        return ans;
    }
};

這是我比賽時候的代碼,已經做了一部分優化了(比較列表長短),但是還是超時,超時的用例就是極限用例。

然後我考慮到,把100個列表按照長度排序,每個列表就只需要看比自己長的列表有沒有覆蓋自己的,把沒有被覆蓋的列表的ID記下來,這樣,每個列表就只需要看比自己長而且沒有被任何列表覆蓋的列表,我花了20分鐘去改,最後沒來得及完成。

代碼二:

struct node
{
    int num;
    int id;
};
bool cmp(node x,node y)
{
    return x.num>y.num;
}
map<string,int>m[105];
class Solution {
public:
    vector<int> peopleIndexes(vector<vector<string>>& favoriteCompanies) {
        vector<node>vn;
        vector<int>ans;
        for(int i=0;i<favoriteCompanies.size();i++)
        {
            m[i].clear();
            for(int j=0;j<favoriteCompanies[i].size();j++)m[i][favoriteCompanies[i][j]]=1;
            node nn;
            nn.num=favoriteCompanies[i].size(),nn.id=i;
            vn.insert(vn.end(),nn);
        }
        sort(vn.begin(),vn.end(),cmp);
        for(int i=0;i<vn.size();i++)
        {
            bool flag=true;
            for(int j=0;flag && (j<i);j++)
            {
                bool flag2=true;
                for(int ii=0;flag2 && (ii<favoriteCompanies[vn[i].num].size());ii++)if(!m[vn[j].num][favoriteCompanies[vn[i].num][ii]])flag2=false;
                if(flag2)flag=false;
            }
            if(flag)ans.insert(ans.end(),vn[i].id);
        }
        sort(ans.begin(),ans.end());
        return ans;
    }
};

事後我的2個同事給了我思路,一個是把map改爲unordered_map,

只把代碼一的第1行改掉,就AC了。

另外一個思路是不用map,把每個列表的字符串排序,然後用雙指針的方法判斷一個列表是不是覆蓋另外一個列表,他這個思路也AC了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章