給你一個數組 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了。