leetcode上two sum解决方案

闲来无事,在leetcode上做了一道题目:
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, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

同一组合不能出现两次,必须对已经出现的组合进行标识,不然最后的结果集合会出现两组相同的元素。
代码如下,两层for循环,数据量特别大的时候,会不会影响程序运行速度?这里我暂时还没想到好的处理方法:

 int GetMapRet( map<int,int> pass, int bIndex, int aIndex )
 {
     if( pass.empty() )
         return -1;

     map<int,int>::iterator it;

     it = pass.begin();
     bool bFlag = false;
     bool aFlag = false;

     while(it != pass.end())
     {
         int index = it->first;
         int bUsed = it->second;
         if(  ( index == bIndex ) && bUsed  )
         {
             bFlag = true;
         }

         if(  ( index == aIndex ) && bUsed  )
         {
             aFlag = true;
         }
         it ++;
     }

     if( aFlag && bFlag)
         return 0;
     return -1 ;
 }

 //
 vector<int> twoSum(vector<int>& nums, int target)
 {
     vector<int> results( 0 ) ;
     map<int,int> flag ;//对于已经求和的组合 不再计算
     for( int eleNum =0; eleNum < nums.size(); eleNum ++  )
     {

         for ( int freeNum = 0; freeNum < nums.size() ; freeNum ++ )
         {
             if( freeNum == eleNum )
                 continue;
             int sum = nums[eleNum] + nums[ freeNum ];

             if( ( target == sum )  )
             {
                 int ret = GetMapRet( flag, eleNum, freeNum );
                 if( ret )
                 {
                     results.push_back( eleNum );
                     results.push_back( freeNum );
                     flag[eleNum] = 1;
                     flag[freeNum] = 1;
                 }

             }
         }
     }

     return results;
 }

如果freeNum 初始值为-1的话,内循环走不进去。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值