zoukankan      html  css  js  c++  java
  • LeetCode

    1. Two Sum 

    Problem's Link


    Mean: 

    给定一个数组nums和一个数target,求:id1和id2,id1和id2为数组nums两个不同的下标,使得nums[id1]+nums[id2]=target.

    注意:nums中元素可重.

    analyse:

    如果nums中没有重复元素,那么可以用map做.

    由于有重复元素,需要用multimap.

    注意:使用map时,需要用count(key)来检测是否存在key值,否则会出现错误.

    Time complexity: O(N*logN)

     

    view code

     

    /**
    * -----------------------------------------------------------------
    * Copyright (c) 2016 crazyacking.All rights reserved.
    * -----------------------------------------------------------------
    *       Author: crazyacking
    *       Date  : 2015-01-29-14.24
    */
    #include <queue>
    #include <cstdio>
    #include <set>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <climits>
    #include <map>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    typedef long long(LL);
    typedef unsigned long long(ULL);
    const double eps(1e-8);
    
    class Solution {
    public:
       vector<int> twoSum(vector<int>& nums, int target)
       {
               int cnt=0;
               vector<int> ans;
               multimap<int,int> mp;
               for(auto p:nums)
                     mp.insert(make_pair(p,cnt++));
               for(auto p:mp)
               {
                     if(mp.count(target-p.first)>0)
                     {
                           multimap<int,int>::iterator it1,it2;
                           if((p.first==target-p.first)&&(mp.count(p.first)==2))
                           {
                                 it1=mp.find(p.first);
                                 ans.push_back((*it1).second+1);
                                 mp.erase(it1);
                                 it2=mp.find(p.first);
                                 ans.push_back((*it2).second+1);
                                 break;
                           }
                           it1=mp.find(p.first);
                           it2=mp.find(target-p.first);
                           ans.push_back((*it1).second+1);
                           ans.push_back((*it2).second+1);
                           break;
                     }
               }
               sort(ans.begin(),ans.end());
               return ans;
       }
    };
    
    int main()
    {
         int n;
         while(cin>>n)
         {
               vector<int> ve;
               for(int i=0,tmp;i<n;++i)
               {
                     cin>>tmp;
                     ve.push_back(tmp);
               }
               int target;
               cin>>target;
               Solution a;
               vector<int> ans=a.twoSum(ve,target);
               for(auto p : ans)
                     cout<<p<<endl;
         }
         return 0;
    }

     

  • 相关阅读:
    影子的宽度&&盒子的个数
    【NOIP2017】【洛谷3958】奶酪cheese(并查集)(dfs)
    【USACO Jan 2011】【洛谷P3008】道路和航线 Roads and Planes
    增肥计划
    【洛谷1379】八数码
    【洛谷1985】【USACO07OPEN】翻转棋
    【NOI1995】极值问题
    车的放置
    【AtCoder
    Design Tutorial: Inverse the Problem
  • 原文地址:https://www.cnblogs.com/crazyacking/p/5021958.html
Copyright © 2011-2022 走看看