码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】two sum --medium

时间:2015-05-24 20:14:08      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

采用二分查找的方法求解,但是超时了。最差情况下的复杂度为O(n^2)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target)
    {
        int last_first_position=0;
        return twoSum(nums,target,last_first_position);
    }
    vector<int> twoSum(vector<int>& nums, int target,int &last_first_position) {
        int n=nums.size();
        int n_half=n/2;
        if(n_half>=2)
        {
            vector<int> nums_lhalf;
            nums_lhalf.insert(nums_lhalf.end(),nums.begin(),nums.begin()+n_half);
            indexs=twoSum(nums_lhalf,target,last_first_position);  //如果是选择左边的数组子集进行递归,那么last_first_position值不变
            nums_lhalf.clear();
            if(!indexs.empty())    //如果不加上这个判定,那么会找到所有符合条件的indexs
                return indexs;
        }
        if(n-n_half>=2)
        {
            last_first_position+=n_half;   //否则首地址就要加上一半
            vector<int> nums_rhalf;
            nums_rhalf.insert(nums_rhalf.end(),nums.begin()+n_half,nums.end());
            indexs=twoSum(nums_rhalf,target,last_first_position);
            if(!indexs.empty())     //如果已经在左子集找到了符合条件的位置,就直接返回值。
                return indexs;
            nums_rhalf.clear();
            last_first_position-=n_half;   //说明不是在右子数组中找到的,需要还原该值
        }
        //只有在n_half>=2时才进行递归,因而在下面的循环中n_half一定是大于等于1的
        for(int i=0;i<n_half;i++)    //如果这个数组的两个子集都没有找到合适的indexs才在当前数组中去寻找
            for(int j=n_half;j<n;j++)
            {
                if(nums[j]==target-nums[i])
                {
                    indexs.push_back(i+last_first_position+1);   //如果这样写,输出的就只是ij的值,应该要输出确定的位置
                    indexs.push_back(j+last_first_position+1);
                    break;    
                }
            }
            return indexs;    
    }
private:vector<int> indexs;
};  

用指针代替向量,但是还是超时了。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target)
    {
        int* first_position,* last_position;
        int position=0;
        first_position=&nums[0];
        last_position=&nums[0]+nums.size();
        return twoSum(nums,target,first_position,last_position,position);
    }
    vector<int> twoSum(vector<int> nums, int target,int* &first_position,int* &last_position,int &position) {
        int n=last_position-first_position;
        int n_half=n/2;
        if(n_half>=2)
        {
            last_position-=n-n_half;
            indexs=twoSum(nums,target,first_position,last_position,position);    
            if(!indexs.empty())    //如果不加上这个判定,那么会找到所有符合条件的indexs
                return indexs;
            last_position+=n-n_half;
        }
        if(n-n_half>=2)
        {
            position+=n_half;
            first_position+=n_half;
            indexs=twoSum(nums,target,first_position,last_position,position);
            if(!indexs.empty())    //如果不加上这个判定,那么会找到所有符合条件的indexs
                return indexs;
            first_position-=n_half;
            position-=n_half;
        }
        //只有在n_half>=2时才进行递归,因而在下面的循环中n_half一定是大于等于1的
        for(int i=0;i<n_half;i++)    //如果这个数组的两个子集都没有找到合适的indexs才在当前数组中去寻找
            for(int j=n_half;j<n;j++)
            {
                if(*(first_position+j)==target-(*(first_position+i)))
                    {
                        indexs.push_back(i+position+1);   
                        indexs.push_back(j+position+1);
                        break;
                }
            }
            return indexs;
    }
    private:vector<int> indexs;
};

void main()
{
    Solution s;
    vector<int> nums;
    nums.push_back(3);
    nums.push_back(2);
    nums.push_back(4);
    nums.push_back(7);
    nums.push_back(8);
    cout<<s.twoSum(nums,11)[0]<< <<s.twoSum(nums,11)[1];
}

 

【leetcode】two sum --medium

标签:

原文地址:http://www.cnblogs.com/wy1290939507/p/4526230.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!