Leetcode - Pointers/Array - Two sum

排序的方法

将数组排序,然后利用前后索引(numBegin指向数组前部,numEnd指向数组尾部)指向已经排序数组的前后元素。

根据下面规则,移动numBegin和numEnd。

1、numbers[numBegin]+numbers[numEnd]>target→numEnd--

2、numbers[numBegin]+numbers[numEnd]<target→numBegin++

3、numbers[numBegin]+numbers[numEnd]=target→numBegin和numEnd所指向的元素便为所求元素。

这时的numBegin和numEnd是所求元素在已经排序的数组内的位置,所以需要在原来数组中寻找所求元素的位置。

注:这里应该sort临时数组temp,不应该sort传递过来的numbers。

注:所求元素有可能值相等,需考虑。

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> temp=numbers;
        int numBegin=0;
        int numEnd=numbers.size()-1;
        vector<int> iRet;
        sort(numbers.begin(), numbers.end());
        while(numBegin<numEnd)
        {
            if(numbers[numBegin]+numbers[numEnd]==target)
            {
                int first=0, second=0;
                for(int i=0;i<temp.size();i++)
                {
                    if(temp[i]==numbers[numBegin]&&first==0)
                    {
                        first=i+1;
                        continue;
                    }
                    if(temp[i]==numbers[numEnd]&&second==0)
                    {
                        second=i+1;
                        continue;
                    }
                    if(first*second)
                        break;
                }
                iRet.push_back(min(first,second));
                iRet.push_back(max(first,second));
                break;
            }
            if(numbers[numBegin]+numbers[numEnd]>target)
                numEnd--;
            if(numbers[numBegin]+numbers[numEnd]<target)
                numBegin++;
        }
        return iRet;
    }
};

map的方法

利用map的下标索引性质:若没有该关键字,则生成该关键字并值初始化。如果map中没有target-numbers[i]该关键字,则将numbers[i]加入map,并赋值为下标号,有的话则OK啦。

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        map<int, int> numMapper;
        vector<int> iRet;
        for (int i=0;i<numbers.size();i++)
        {
            if(numMapper[target-numbers[i]]>0)
            {
                iRet.push_back(numMapper[target-numbers[i]]);
                iRet.push_back(i+1);
            }
            else
                numMapper[numbers[i]]=i+1;
        }
        return iRet;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值