Two Sum

Two Sum

我的思路:

1、这题就是一个悲剧,一开始题目看了,但是解题的时候题目想成了任意多个数相加(题目的说明是两个数相加得到目标数)所以我做的都是白费劲。这题要返回数字在原数组中的下表+1的值。所以对于原数组进行排序也是不行的,要拷贝一份。虽然做的错的,还是说下我的想法。

2、两个函数,先对数组降序排序,然后开始从后往前找,接着进入循环,进入核心函数,核心函数就是继续判断是否满足条件。如果小于目标值,那就push进去,回到主函数,如果有找不到目标值了,发现下表小于0,那就开始从最后删除一个元素,然后跳过这个数,继续之前的工作。这里有一个虽然可以得到很多数的结果,但是效率很低,而且最后还要一个数一个数地去找该数在原数组中的下标。

3、代码就不贴了,写得那么烂。


别人思路1:

1、这里提供两个思路。

2、因为这里只有两个数,而且一定会有结果,于是我们只要设定两个指针,从头尾不断往前移动,当然先对数组排序。最后要防止两个数相同的情况,在找下标的时候要分开查找。而且如果还要保证下标push进去的先小后大的顺序。

代码如下:

    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int>                             answer;
        if (numbers.size() < 2)
                return answer;
        vector<int>                             backup = numbers;
        sort(backup.begin(), backup.end());
        vector<int>::size_type                  i, j;
        for (i = 0, j = backup.size() - 1; i != j; ) {
                if (backup[i] + backup[j] == target)
                        break;
                else if (backup[i] + backup[j] < target)
                        i++;
                else
                        j--;
        }
        vector<int>::iterator   k, l;
        k = find(numbers.begin(), numbers.end(), backup[i]);
        if ((l = find(k + 1, numbers.end(), backup[j])) == numbers.end())
                l = find(numbers.begin(), k, backup[j]);
        if (k - numbers.begin() > l - numbers.begin()) {
                answer.push_back(l - numbers.begin() + 1);
                answer.push_back(k - numbers.begin() + 1);
        }
        else {
                answer.push_back(k - numbers.begin() + 1);
                answer.push_back(l - numbers.begin() + 1);
        }
        return answer;
    }
别人思路2:

1、利用map来寻找,只要将每个数都存到map中,只要在map中能找到目标值减去当前值的值,就可以push,由于我们是从第一个值开始查找,那么不需要判断顺序,只需要判断是否得到的是不是同一个值。

2、对于两个数相加只有三种情况:一大一小,一小一大,一样大。

代码如下:

    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> answer;
        int length = numbers.size();
        if (length < 2)
            return answer;
        map<int, int> mp;
        for (int i = 0; i < length; i++)
            mp[numbers[i]] = i;
        map<int, int>::iterator it = mp.end();
        for (int i = 0; i < length; i++) {
            if ((it = mp.find(target - numbers[i])) != mp.end() && it->second != i) {
                answer.push_back(i + 1);
                answer.push_back(it->second + 1);
                break;
            }
        }
        return answer;
    }

心得体会:

做题主要是能分析题目的核心,以及考虑到除了整体框架之外还有什么特殊情况。最好能依据不同的问题,找到最快的解题办法。虽然思路2代码短,但明显思路1的速度更快。代码2在每次循环都要查找整个map。但是思路1只需要判断两个数相加的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值