(1)Two Sum-----LeetCode

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2


解題思路:

(1)剛開始的解決思路是 暴力法(順序判斷給定數組兩兩相加的所有的可能情況),時間複雜度O(N^2),然後很自然的悲劇了,時間超時……ORZ

(2)O(nlogn)。排序,然後兩個指針一前一後。因爲題中說明了只有一對答案,因此不需要考慮重複的情況。

(3)O(n)。哈希表。將每個數字放在map中,歷遍數組,如果出現和數組中的某一個值相加爲target的時候,break。這個方法同樣適用於多組解的情況。


這裏只給出,(1)和(2)的代碼實現,因爲(3)的自己沒敲,不過肯定能用。

(1)暴力法的超時版本

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target)
	{
		vector<int>::iterator i, j;
		vector<int> result;
        for (i = nums.begin(); i < nums.end(); ++i)
        {
        	if (*i >= target)
        	{
        		return result;
        	}
        	else
        	{
        		j = i;
        		for (++j; (j<nums.end())&&(*j<target); ++j)
        		{
        			if (*j + *i == target)
        			{
						result.push_back(i - nums.begin() + 1 );
						result.push_back(j - nums.begin() + 1);
						return result;
        			}
        		}
        	}
        }
    }
};

(2)排序後,再首尾判斷數組的和是否等於目標值。

</pre><p></p><pre name="code" class="cpp">struct Node
{
    int num, pos;
};
bool cmp(Node a, Node b)
{
    return a.num < b.num;
}
class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target)
     {
        vector<int> result;
        vector<Node> array;
        for (int i = 0; i < numbers.size(); i++)
        {
            Node temp;
            temp.num = numbers[i];
            temp.pos = i;
            array.push_back(temp);
        }


        sort(array.begin(), array.end(), cmp);
        for (int i = 0, j = array.size() - 1; i != j;)
        {
            int sum = array[i].num + array[j].num;
            if (sum == target)
            {
                if (array[i].pos < array[j].pos)
                {
                    result.push_back(array[i].pos + 1);
                    result.push_back(array[j].pos + 1);
                } else
                {
                    result.push_back(array[j].pos + 1);
                    result.push_back(array[i].pos + 1);
                }
                break;
            } else if (sum < target)
            {
                i++;
            } else if (sum > target)
            {
                j--;
            }
        }
        return result;
    }
};

發佈了13 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章