Two Sum

注释的部分是普通解法o(n^2)

排序使数组是有序的,O(nlgn)的时间复杂度(注意用到了快排!)就可以解决了,此题注意小标即可!指针从俩边向中间靠拢!


#include<algorithm>

struct num_type
    {
    	int val;
    	int pos;
    };

    bool cmp(num_type a,num_type b)
    {
    	return a.val < b.val;
    }
    
class Solution {
public:
    
    
     vector<int> twoSum(vector<int> &numbers, int target) 
	 {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
		/*
		vector<int> index;
        for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++ it)
		{
			for(vector<int>::iterator second = it+1; second != numbers.end(); ++ second)
			{
				
				if ((*it + *second) == target)
				{
					index.push_back(it-numbers.begin()+1);
					index.push_back(second-numbers.begin()+1);
				}
			}
		}
		return index;
		*/
		
		
		 vector<int> index;
			 vector<num_type> sort_numbers;
			 int sum;
			 for (vector<int>::iterator it = numbers.begin();it != numbers.end();it++)
			 {
				num_type temp;
				temp.val = *it;
				temp.pos = it-numbers.begin();
				sort_numbers.push_back(temp);
			 }

			 sort(sort_numbers.begin(),sort_numbers.end(),cmp);//排序
			
			 vector<num_type>::iterator begin_pos,end_pos;
			 begin_pos = sort_numbers.begin();
			 end_pos = sort_numbers.end()-1;//下标要注意!
			 while(begin_pos != end_pos)
			 {
				sum = (*begin_pos).val + (*end_pos).val;
			
				if (sum == target)
				{
					if ((*begin_pos).pos < (*end_pos).pos)
					{
						index.push_back((*begin_pos).pos+1);
						index.push_back((*end_pos).pos+1);
					}
					else
					{
						index.push_back((*end_pos).pos+1);
						index.push_back((*begin_pos).pos+1);
					}
				
					break;

				}
				else if (sum < target)//以下为首位指针向俩边靠拢!
				{
					begin_pos++;
				}
				else
				{
					end_pos--;
				}
			
			 
		}
			 return index;
	
    }
};

第二次:此题在编程之美有,第一思路是用hash_map 来做(已知第一个,查第二个很快)。但是由于hash_map 是扩展的STL非标准,在vs2008 使用时需加上 using namespacce stdext;  vs2008 其功能较完善,测试了下支持string,不用自己自定义!

此处用的排序,再用双端指针,向中间夹逼!

class Solution {
    
    struct data_t
    {
        int val;
        int pos;
    };
    struct cmp_t
    {
        bool operator()(data_t t1,data_t t2)
        {
            return t1.val < t2.val;
        }
    };
    
public:
    vector<int> twoSum(vector<int> &numbers, int target) 
    {
        if(numbers.size()<2) return vector<int>();
        
        vector<data_t> data(numbers.size());
        for(int i = 0;i < numbers.size();i++)
        {
             data[i].val =   numbers[i];  
             data[i].pos =   i+1; 
        }
               
        sort(data.begin(),data.end(),cmp_t());
        
        int left = 0;
        int right = numbers.size()-1;
        int sum = 0;
        vector<int> res(2);
        
        while(left < right)
        {
            sum = data[left].val + data[right].val;
            if(sum == target)
            {
                 if(data[left].pos > data[right].pos )
                 {
                     res[0] =  data[right].pos;
                     res[1] =  data[left].pos;
                 }
                 else
                 {
                     res[0] =  data[left].pos;
                     res[1] =  data[right].pos;
                 }
                 return res;
            }
            else if(sum < target)
            {
                left++;
            }
            else
            {
                right--;
            }
        }
        
        return vector<int>();
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值