我的思路:
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只需要判断两个数相加的值。