LeetCode 4sum
1573 ワード
リンク:https://oj.leetcode.com/problems/4sum/
1つの方法は,3 sumと同様にヘッドテールポインタを用いて交互に移動し,時間的複雑度をO(n 3),空間的複雑度をO(1)とし,注意を払うことである.
もう1つの比較的効率的な方法は、空間の複雑さを犠牲にして時間の複雑さを取り替えることです.
ハッシュテーブルを使用してすべての要素の2つの和を格納し、2 sumを1回作成します.
また,2 sumは線形アルゴリズムがある:すべての要素をハッシュテーブルのように配置し,ハッシュテーブルによりtarget−numが存在するか否かを判断するが,ハッシュテーブルを利用しているため,判断のたびに定数レベルの時間しかかからない.
重さを落とすならsetも考えられます
1つの方法は,3 sumと同様にヘッドテールポインタを用いて交互に移動し,時間的複雑度をO(n 3),空間的複雑度をO(1)とし,注意を払うことである.
class Solution
{
public:
vector<vector<int> >fourSum(vector<int> &num,int target)
{
vector<vector<int> > ans;
sort(num.begin(),num.end());
int n=num.size();
for(unsigned int i=0;i<n;i++)
{
if(i > 0 && num[i] == num[i-1])
continue;
for(unsigned int j=i+1;j<n;j++)
{
if(j > i + 1 && num[j] == num[j-1])
continue;
int st=j+1,en=n-1;
while(st<en)
{
if(st>j+1&&num[st]==num[st-1])
{
st++;
continue;
}
if(en<n-1&&num[en]==num[en+1])
{
en--;
continue;
}
int sum=num[i]+num[j]+num[st]+num[en];
if(sum>target)
en--;
if(sum<target)
st++;
if(sum==target)
{
vector<int> tem;
tem.push_back(num[i]);
tem.push_back(num[j]);
tem.push_back(num[st]);
tem.push_back(num[en]);
ans.push_back(tem);
tem.clear();
st++;
en--;
}
}
}
}
return ans;
}
};
もう1つの比較的効率的な方法は、空間の複雑さを犠牲にして時間の複雑さを取り替えることです.
ハッシュテーブルを使用してすべての要素の2つの和を格納し、2 sumを1回作成します.
また,2 sumは線形アルゴリズムがある:すべての要素をハッシュテーブルのように配置し,ハッシュテーブルによりtarget−numが存在するか否かを判断するが,ハッシュテーブルを利用しているため,判断のたびに定数レベルの時間しかかからない.
重さを落とすならsetも考えられます