您的位置:首页 > 其它

LeetCode: Two Sum

2013-04-22 08:10 399 查看
坑爹的多数次过。。

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int left = 0;
int right = numbers.size() - 1;
vector<int> ret;
map<int, vector<int>> S;
for (int i = 0; i < numbers.size(); i++) S[numbers[i]].push_back(i+1);
sort(numbers.begin(), numbers.end());
while (left < right) {
if (numbers[left] + numbers[right] == target) {
if (S[numbers[left]].size() > 1) {
ret.push_back(S[numbers[left]][0]);
ret.push_back(S[numbers[right]][1]);
return ret;
}
int a = S[numbers[left]][0];
int b = S[numbers[right]][0];
if (a > b) {
ret.push_back(b);
ret.push_back(a);
}
else {
ret.push_back(a);
ret.push_back(b);
}
return ret;
}
if (numbers[left] + numbers[right] < target) left++;
else right--;
}
}
};


后来写了另外一段代码,更清楚点

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map<int, int> S;
for (int i = 0; i < numbers.size(); i++) S[i+1] = numbers[i];
sort(numbers.begin(), numbers.end());
int left = 0;
int right = numbers.size()-1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) break;
if (sum < target) left++;
else right--;
}
vector<int> ret;
int first, second;
first = second = 0;
for (map<int, int>::iterator it = S.begin(); it != S.end(); it++) {
if (numbers[left] == it->second || numbers[right] == it->second) {
if (!first) first = it->first;
else second = it->first;
}
}
if (first > second) swap(first, second);
ret.push_back(first);
ret.push_back(second);
return ret;
}
};


C#

public class Solution {
public int[] TwoSum(int[] nums, int target) {
Dictionary<int, int> S = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++) S.Add(i+1, nums[i]);
Array.Sort(nums);
int left = 0, right = nums.Length-1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) break;
if (sum < target) left++;
else right--;
}
int[] ans = new int[2];
int first = 0, second = 0;
foreach (var v in S) {
if (nums[left] == v.Value || nums[right] == v.Value) {
if (first == 0) first = v.Key;
else second = v.Key;
}
}
if (first > second) {
int tmp = first;
first = second;
second = tmp;
}
ans[0] = first;
ans[1] = second;
return ans;
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: