電面:1つの配列にkの2つの数を探し出す
タイトルの通り、実はLeetCodeにも道の差が少ない問題があり、Two Sumはこの2つの数の対応する下付き文字を返します.では、LeetCodeの問題に従って書きましょう.まず二重ポインタの方法を使いますが、LeetCodeの上に下付き文字を返すように要求されているので、sortで元の配列を直接ソートすることはできません.前の元の下付き文字に影響します.まず配列をコピーしなければなりません二重ポインタは何も言うことはありません.もう順番ができているので、一つは一番左端から、一つは一番右端から行きます.これを書くのは主にCのqsortソートを学ぶためです.
Two Sum Cコード:
16/16 test cases passed. Status: Accepted Runtime: 4 ms
下書きに戻るから、適当なのはハッシュでやるべきだ.問題を抽象化することができる.x+y=targetを知りたいなら、関数関係y=target-x、f:A->Bをこのように定義することができます.関数の定義ドメインAは、与えられた配列である.値ドメインは、Aのすべての要素の像の集合Cである.私たちが見つけたいy∈SはSは、値ドメイン集合Cと定義ドメイン集合Aとの交差である(y∈C^y∈Aは所与の配列の中で2つの数を探すため).遍歴するたびに関数関係y=target-xで1つのyを得ることができるが、私たちはy∈Sだけを探す.では、どのようにSを探すのか.大まかな考え方は、1つの空の集合Dに対して、y=target-xで得られたy∉Dに対して、私たちはxをDに追加し、Dの中ですべてxに相当し、y=target-xで得られたy∈D,ではyはSに属する.
16/16 test cases passed. Status: Accepted Runtime: 16 ms
Two Sum Cコード:
typedef struct{
int val;
int idx;
}Node;
int cmp(const void* a,const void* b)
{
return (*(Node*)a).val-(*(Node*)b).val;
}
int* twoSum(int *nums,int numsize,int target)
{
int* res=(int*)malloc(sizeof(int)*2);
if(numsize==0)
{
return res;
}
Node* nodes=(Node*)malloc(sizeof(Node)*numsize);
for(int i=0;i<numsize;i++)
{
nodes[i].val=nums[i];
nodes[i].idx=i;
}
qsort(nodes,numsize,sizeof(Node),cmp);
int low=0,high=numsize-1;
while(low<high)
{
if(nodes[low].val+nodes[high].val==target)
{
if (nodes[low].idx < nodes[high].idx)
{
res[0] = nodes[low].idx;
res[1] = nodes[high].idx;
}
else
{
res[1] = nodes[low].idx;
res[0] = nodes[high].idx;
}
break;
}
else if(nodes[low].val+nodes[high].val<target)
{
low++;
}
else
{
high--;
}
}
return res;
}
16/16 test cases passed. Status: Accepted Runtime: 4 ms
下書きに戻るから、適当なのはハッシュでやるべきだ.問題を抽象化することができる.x+y=targetを知りたいなら、関数関係y=target-x、f:A->Bをこのように定義することができます.関数の定義ドメインAは、与えられた配列である.値ドメインは、Aのすべての要素の像の集合Cである.私たちが見つけたいy∈SはSは、値ドメイン集合Cと定義ドメイン集合Aとの交差である(y∈C^y∈Aは所与の配列の中で2つの数を探すため).遍歴するたびに関数関係y=target-xで1つのyを得ることができるが、私たちはy∈Sだけを探す.では、どのようにSを探すのか.大まかな考え方は、1つの空の集合Dに対して、y=target-xで得られたy∉Dに対して、私たちはxをDに追加し、Dの中ですべてxに相当し、y=target-xで得られたy∈D,ではyはSに属する.
vector<int> twoSum(vector<int>& nums, int target) {
int len=nums.size();
vector<int> res;
if(len==0){
return res;
}
unordered_map<int,int> m;
int y;
for(int i=0;i<len;i++){
y=target-nums[i];
if(m.find(y)==m.end()){//m
m[nums[i]]=i;
}
else{
res.push_back(m[y]);
res.push_back(i);
break;
}
}
return res;
}
16/16 test cases passed. Status: Accepted Runtime: 16 ms