leetcode 1 two sum

暴力求解的方式

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector <int> result;
        for(int i=0;i<nums.size();i++)
        {
           for (int j=i+1;j<nums.size();j++)
           {
               if(nums[j]==target-nums[i])
               {
                   result.push_back(i);
                   result.push_back(j); 
                  return result;
                
               }
            
           }        
            
        }
      
        
    }
};

改进版本 不采用两层循环用unordered_map 完成

//#include<tr1/unordered_map>
#include <iostream>
#include <vector>
#include <cassert>
#include <unordered_map>
#include <map>
using namespace std;

/// Two-Pass Hash Table
/// Time Complexity: O(n)
/// Space Complexity: O(n)
class Solution {
public:
    vector <int> twoSum(vector<int>& nums, int target) {

          unordered_map<int,int> record;
          unordered_map<int,int> ::iterator it;
          
          // 首先先进行一次map 操作,时间为O(N) 
         for(int i = 0 ; i < nums.size() ; i ++)
			record[nums[i]] = i;
			
		// record->second 记录的是 数所在的位置 
		// 然后利用迭代器进行查找,注意由于两个数字不能重复
		
		for(int i = 0 ; i < nums.size() ; i ++)
	{
		unordered_map <int ,int >:: iterator iter = record.find ( target - nums [i] );
		if (iter != record.end() && iter ->second != i ) 
		{
			int res[] ={i,iter->second};
			return vector<int> (res,res+2);
		 } 	
	}

        }
			
};
		

void printVec(const vector<int>& vec){
    for(int e: vec)
        cout << e << " ";
    cout << endl;
}

int main() {

    const int nums[] = {0,4,3,0};
    vector<int> nums_vec( nums, nums + sizeof(nums)/sizeof(int) );
    int target = 0;
   vector<int> result = Solution().twoSum(nums_vec, target);
   printVec(result);
    

    return 0;
}


后续可以尝试用改进的版本写leetcode 15sum3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值