zoukankan      html  css  js  c++  java
  • [算法练习]Two Sum

    题目说明:

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

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

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    程序代码:

    #include <gtest/gtest.h>
    #include <map>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    // 暴力遍历
    vector<int> twoSum1(vector<int>& nums, int target) 
    {
        vector<int> results;
        for (int i=0; i< nums.size(); ++i)
        {
            for (int j=i+1; j < nums.size(); ++j)
            {
                if (nums[i]+nums[j] == target)
                {
                    results.push_back(i);
                    results.push_back(j);
                    break;
                }
            }
        }
    
        return results;
    };
    
    // 缓存映射
    vector<int> twoSum2(vector<int>& nums, int target)
    {
        vector<int> results;
        map<int, vector<int> > cache;
        bool find = false;
    
        for (unsigned int i=0; i<nums.size(); ++i)
        {    
            cache[nums[i]].push_back(i);        
        }
    
        for (unsigned int i=0; i<nums.size(); ++i)
        {
            map<int, vector<int> >::const_iterator it = cache.find(target-nums[i]);
            if (it != cache.end())
            {
                for (unsigned int j = 0; j< it->second.size(); ++j)
                {
                    if (i != it->second[j])
                    {
                        results.push_back(i);
                        results.push_back(it->second[j]);
                        find = true;
                        break;
                    }
                }
    
                if (find)
                {
                    break;
                }
            }
        }
    
        return results;
    };
    
    // 排序后查找
    struct Node
    {
        int index;
        int value;
    
        Node(int i, int v)
        {
            index = i;
            value = v;
        }
    
        bool operator < (Node& ref)
        {
            return value < ref.value;
        }
    };
    
    vector<int> twoSum(vector<int> &nums, int target) 
    {
        vector<int> results;
        vector<Node> cache;
    
        for (int i=0; i<nums.size(); ++i)
        {
            cache.push_back(Node(i, nums[i]));
        }
    
        sort(cache.begin(), cache.end());
    
        for (int i = 0, j = cache.size() - 1; i < j;)
        {
            int value = cache[i].value + cache[j].value;
            if (value == target)
            {
                results.push_back(min(cache[i].index, cache[j].index));
                results.push_back(max(cache[i].index, cache[j].index));
                break;
            }
            else if (value > target)
            {
                --j;
            }
            else
            {
                ++i;
            }
        }
        
        return results;
    };
    
    TEST(Pratices, tTwoSum)
    {
        // [3, 3, 1, 2]  3 => [0, 1]
        // [2, 7, 11, 15] 9 => [0, 1]
        // [-1, 8, 10, 12, 40, 11] 10 => [0,5]
    
        vector<int> data;
        data.push_back(3);
        data.push_back(3);
        data.push_back(1);    
        data.push_back(2);    
        vector<int> results =  twoSum(data,6);
    
        data.clear();
        data.push_back(2);
        data.push_back(7);
        data.push_back(11);
        data.push_back(15);
        results =  twoSum(data,9);
    
        data.clear();
        data.push_back(-1);
        data.push_back(8);
        data.push_back(10);
        data.push_back(12);
        data.push_back(40);
        data.push_back(11);
        results =  twoSum(data,10);
    }
  • 相关阅读:
    Linux之网络基础
    Tomcat配置虚拟目录并发布web应用
    Linux之权限管理操作
    Linux之shell编程基础
    Python简介
    Python代码注释 Python零基础入门教程
    Python Pycharm Anacanda 区别
    Python Hello World入门
    Python2.x 和 Python3.x,如何选择?
    数据库课程设计心得【1】
  • 原文地址:https://www.cnblogs.com/Quincy/p/5212794.html
Copyright © 2011-2022 走看看