• LintCode-56.两数之和


    两数之和

    给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
    你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。

    注意事项

    你可以假设只有一组答案。

    样例

    给出 numbers = [2, 7, 11, 15], target = 9, 返回 [1, 2].

    挑战

    Either of the following solutions are acceptable:

    • O(n) Space, O(nlogn) Time
    • O(n) Space, O(n) Time

    标签

    排序 哈希表 爱彼迎 数组 脸书 两根指针

    方法一:暴力破解

    时间复杂度O(n^2)

    code

    class Solution {
    public:
        /*
         * @param numbers : An array of Integer
         * @param target : target = numbers[index1] + numbers[index2]
         * @return : [index1+1, index2+1] (index1 < index2)
         */
        vector<int> twoSum(vector<int> &nums, int target) {
            // write your code here
            if(nums.empty())   {  
                return vector<int>();  
            } 
              
            int len = nums.size();  
            vector<int> ret;  
            for(int i=0; i<len; ++i)   {  
                for(int j=i+1; j<len; ++j)   {  
                    if(nums[i] + nums[j] == target)   {  
                        ret.push_back(i+1);  
                        ret.push_back(j+1);  
                        return ret;  
                    } 
                }
            }
            return vector<int>();
        }
    };
    

    方法二:利用hash

    时间复杂度O(n),空间复杂度O(n)

    code

    class Solution {
    public:
        /*
         * @param numbers : An array of Integer
         * @param target : target = numbers[index1] + numbers[index2]
         * @return : [index1+1, index2+1] (index1 < index2)
         */
        vector<int> twoSum(vector<int> &nums, int target) {
            // write your code here
            int size = nums.size();
            int i = 0;
            vector<int> result;
    
            if(size <= 0) {
                return result;
            }
    
            map<int, int> hashMap;
    
            for(i=0; i<size; i++) {
                hashMap.insert(pair<int, int>(nums[i], i));
            }
    
            for(i=0; i<size; i++) {
                int temp = target - nums[i];
                if (hashMap.count(temp)!=0 && hashMap[temp]!=i) {
                    result.push_back(i+1);
                    result.push_back(hashMap[temp]+1);
                    break;
                }
            }
            if(result[0] > result[1]) {
                int temp = result[0];
                result[0] = result[1];
                result[1] = temp;
            }
            return result;
        }
    };
    
  • 相关阅读:
    IOS7 About
    iOS Newsstand Tutorial
    微信开发商
    网络流量监控相关资料
    EDM about
    thinkphp验证码的实现
    thinkphp表单上传文件并将文件路径保存到数据库中
    thinkphp分页实现
    linux 系统简单备份
    Google Hacking总结
  • 原文地址:https://www.cnblogs.com/libaoquan/p/6808064.html
Copyright © 2020-2023  润新知