无序数组中找出和为N的两个数 Two Sum

如果是有序数组,很简单。两头指针往中间相遇即可。

因此对于无序数组,排序即可。

唯一的麻烦题目要求的:要返回两个数在排序之前原数组里的序号。因此我需要在排序时也要保留原来的序列号。


这里主要是以前不写STL的程序。这里用到vector。pair。sort。

vector常用到的vector.size()表示当前vector里的数据个数。

初始化vector时用 vector<元素类型> v; 这样就定义了一个空的vector。添加元素使用v.push_back()。访问时可用v[i],但添加元素时不可以。

对vector排序可以使用stl自带的方法:

sort(v.begin(), v.end(), myfun);
其中如果v的元素不是int这样的简单类型,需要自己写一个myfun函数来告诉程序到底比较的是什么。

pair是一个很好用的结构。

这里我用pair把数组的数据和编号绑定在了一起。


在最后我遇到了一个问题:

编译出错,搜到的解决访问在这里。

可能和类成员函数的函数原型有关。因为类的所有成员函数都有一个隐含的指针参数,即this。但是stl的所要求的sort自定义函数是不要this指针的。这就和sort需要的比较函数原型不一致了,所以就报错了。所以设置成static函数,因为他天生不带this指针。

http://blog.csdn.net/flybywind/article/details/7536311

class Solution {
public:
    static bool myfun(const pair<int, int> a, const pair<int, int> b)
    {
    	return a.first < b.first;
    }

    vector<int> twoSum(vector<int> &numbers, int target) {

		int i,j;
		vector< pair<int, int> > index;
		for(i=0;i<numbers.size();i++)
		{
			pair<int, int> tmp;
			tmp.first = numbers[i];
			tmp.second = i+1;
			index.push_back(tmp);
		}
		sort(index.begin(), index.end(), myfun);

        i = 0;
        j = index.size() - ;
        while(i<j)
        {
            if(index[i].first + index[j].first >target)
                j--;
            else if(index[i].first + index[j].first <target)
                i++;
            else
                break;
        }

		vector<int> result;
		int idx1,idx2;
		if(index[i].second < index[j].second)
		{
			idx1 = index[i].second;
			idx2 = index[j].second;
		}
		else
		{
			idx2 = index[i].second;
			idx1 = index[j].second;	
		}

        result.push_back(idx1);
        result.push_back(idx2);
        return result;
    }
};


Hash方法:可以考虑使用hash。将数组的每个元素以元素值位key,下标为value存入hash表。然后第二次遍历时,在hash中查询target做减法后的差值,hash表中存在该差值就算找到了。注意一点:当数组中存在重复元素时,注意hash表该如何查找;两个数不能为同一个数。

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        unordered_map<int, int> hashtable;
        vector<int> result;
        int n = numbers.size();
        for(int i=0;i<n;i++)
            hashtable[numbers[i]] = i+1;
            
        for(int i=0;i<n;i++)
        {
            int other = target - numbers[i];
            if(hashtable.find(other) != hashtable.end())
            {
                int j = hashtable[other];
                if(i+1 == j)
                    continue;
                result.push_back(i+1);
                result.push_back(j);
                break;
            }
        }
        return result;
    }
};


你可能感兴趣的:(无序数组中找出和为N的两个数 Two Sum)