俩数之和

给定一个整数数组,一个目标值,输出相加等于目标值的数的下标。
在这里插入图片描述
最简单:暴力法:双层循环
俩层循环O(n2)
思路二:
排序后双指针
细节处理,
排序后下表改变,所以需要构造node接点存下标

class Solution {
public:    
typedef struct node    {        
int val;        
int idx;        
bool operator <(const node &s) const                                    //重载<运算符,目的是调用sort函数以node.val的升序进行排列        
{            
return val<s.val;        
}     
}node;     
vector<int> twoSum(vector<int>& nums, int target) {
 vector<node> nodenums;        
for(int i=0;i<nums.size();i++)//构造nodenums数组并按val的值升序排列        {            
node no;            
no.val=nums[i];            
no.idx=i;            
nodenums.push_back(no);        
}        
sort(nodenums.begin(),nodenums.end());                
vector<int> res;  //res返回结果        
int i=0,j=nums.size()-1;    
while(i<j){         
int sum =nodenums[i].val + nodenums[j].val;        
if(sum < target) i++;        
if(sum > target) j--;        
if(sum == target){           
            res.push_back(nodenums[i].idx);           res.push_back(nodenums[j].idx);            
            break;        
          }    
        }        
        return res;    
     }
 };

思路三 map处理

map,键值对

map的另外一种unordered_map:

无需有序,用unordered_map
运行时间多于map

class Solution {
public:    
vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
                
        for(int i = 0; i < nums.size(); i++) {           
	        auto iter = map.find(target - nums[i]);            
	        if(iter != map.end()) {//找到                
	             return {iter->second, i};
	       //  iter->second存的是下标,i则为另一个与其相加为目标的下标          
	            }            
	        map.insert(pair<int, int>(nums[i], i));       
     }        
    return {};    
   }
 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值