该题目在编程之美上看过该题目,解题思路很清晰,先排序再从头和尾遍历一次,但写起来还是有很多问题:
1. 输出的下标为未排序的vector内元素的下标,因此排序过程中需要记录下标位置,我为了省事直接使用c++中sort函数,然后通过查找元素在原vector中位置得到下标;因此也引出了另一个问题,如果两个元素相同,得到相同的位置;
2. 要求两个下标位置从小到大;
//2014年8月22日19:17:30
//2014年8月22日19:44:32
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> retVec;
vector<int> num = numbers;
sort(numbers.begin(),numbers.end());
int i = 0,j = numbers.size()-1;
while(i != j){
if(numbers[i]+numbers[j] > target){
j--;
continue;
}
if(numbers[i]+numbers[j] < target){
i++;
continue;
}
if(numbers[i]+numbers[j] == target){
int smaller,bigger;
smaller = find(num.begin(),num.end(),numbers[i])-num.begin();
if(numbers[i] != numbers[j]){
bigger = find(num.begin(),num.end(),numbers[j])-num.begin();
}
else{
vector<int>::iterator it = find(num.begin(),num.end(),numbers[i]);
bigger = find(it+1,num.end(),numbers[i])-num.begin();
}
if(bigger < smaller){
retVec.push_back(bigger+1);
retVec.push_back(smaller+1);
}
else{
retVec.push_back(smaller+1);
retVec.push_back(bigger+1);
}
return retVec;
}
}
return retVec;
}
};
int main()
{
int num[] = {5,75,25};
vector<int> numbers(num,num+3);
int target = 100;
Solution A;
vector<int> result = A.twoSum(numbers,target);
for(auto d:result){
cout << d << endl;
}
return 0;
}