题意:从一堆数里面找出两个数,使它们的和满足target。
排序代码;
class Solution {
public:
class node
{
public:
int num;
int index;
friend bool operator< (const node& x,const node& y)
{
return x.num < y.num;
}
};
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> ans;
int nSize = numbers.size();
vector<node> nodeNumbers;
nodeNumbers.resize(nSize);
for(int i = 0;i < nSize;i++)
{
nodeNumbers[i].num = numbers[i];
nodeNumbers[i].index = i+1;
}
sort(nodeNumbers.begin(),nodeNumbers.end());
for(int i = 0;i < nSize;i++)
{
int diff = target-nodeNumbers[i].num;
for(int j = i+1;j < nSize;j++)
{
if(nodeNumbers[j].num == diff)
{
ans.push_back(min(nodeNumbers[i].index,nodeNumbers[j].index));
ans.push_back(max(nodeNumbers[i].index,nodeNumbers[j].index));
break;
}
else if(nodeNumbers[j].num > diff)
{
break;
}
}
if(ans.size())
break;
}
return ans;
}
};
Hash代码;
class Solution {
public:
class node
{
public:
int num;
int index;
node* nextNode;
};
class hashList
{
private:
const static int maxP = 77953;
node* list[maxP];
public:
hashList()
{
memset(list,0,sizeof(node*)*maxP);
}
int hashInsert(int num,int index)
{
int slot = abs(num)%maxP;
node* newNode = new node;
newNode->num = num;
newNode->index = index;
newNode->nextNode = list[slot];
list[slot] = newNode;
return 0;
}
int hashCheck(int num)
{
int slot = abs(num)%maxP;
node* tmpNode;
for(tmpNode = list[slot];tmpNode != NULL;tmpNode = tmpNode->nextNode)
{
if(tmpNode->num == num)
{
return tmpNode->index;
}
}
return 0;
}
};
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> ans;
int nSize = numbers.size();
hashList* L = new hashList;
for(int i = 0;i < nSize;i++)
{
L->hashInsert(numbers[i],i+1);
}
for(int i = 0;i < nSize;i++)
{
int diff = target-numbers[i];
int re = L->hashCheck(diff);
if(re != 0&&i != re-1)
{
ans.push_back(min(i+1,re));
ans.push_back(max(i+1,re));
break;
}
}
delete[] L;
return ans;
}
};