Two Sum (LeetCode)

Question:

https://oj.leetcode.com/problems/two-sum/

 

要快速知道另外一个值存在不存在,只有利用hash table. 最开始想错了,先对整个array建立hash table,然后还要考虑某些点值相同的情况,其实没有必要。因为当前点只需要跟以前的点比较。

因为只需要一个答案,找到一个就可以推出循环了。同时不需要操心duplicate value的问题。比如target=6, array={3,...., 3....},当遇到第二个3的时候,我们就得到结果,不需要继续处理。如果target是5,我们前面已经有一个3了,第二个3就完全可以忽略了。

 

    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> result;
        
        Hash1(result, numbers, target);
        
        return result;
    }
   
    void Hash1(vector<int>& result, vector<int>& numbers, int target)
    {
        std::unordered_map<int, int> table;
        for (int i = 0; i < numbers.size(); i++)
        {
            int value = target - numbers[i];
            
            if (table.find(value) != table.end())
            {
                result.push_back(table[value]+1);
                result.push_back(i+1);
                break;
            }
            
            table[numbers[i]] = i;
        }
    }

 

想多了的解法:

    void Hash(vector<int>& result, vector<int>& numbers, int target)
    {
        std::unordered_map<int, vector<int>> table;
        for (int i = 0; i < numbers.size(); i++)
        {
            table[numbers[i]].push_back(i);
        }
        
        for (int i = 0; i < numbers.size(); i++)
        {
            int value = target - numbers[i];
            
            
            if (table.find(value) != table.end())
            {
                if (value != numbers[i] || table[value].size() > 1)
                {
                    int index1 = i;
                    int index2 = table[value][0];
                    
                    if (index1 == index2)
                        index2 = table[value][1];
                        
                    result.push_back(index1 < index2 ? index1+1 : index2+1);
                    result.push_back(index1 < index2 ? index2+1 : index1+1);
                    break;
                }
            }
        }
    }

 

posted @ 2015-01-29 13:55  smileheart  阅读(138)  评论(0)    收藏  举报