题目
思路
由于很长时间没有编程,所以就按顺序选择了这道难度为easy的题练练手。这道题难度很低,很容易解答,唯一的一点难度就是对vector容器的正确使用。算法使用了两层循环,第一层循环遍历每一个元素,第二层循环向遍历查找是否存在使得与这个元素相加得到目标值的另外一个元素,时间复杂度是O(n^2)。
源程序class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> answer;
for(int i = 0;i <nums.size() - 1;i ++)
for(int j = i + 1;j < nums.size();j ++)
if(nums[i] + nums[j] == target){
answer.push_back(i);
answer.push_back(j);
break;
}
return answer;
}
};
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> answer;
for(int i = 0;i <nums.size() - 1;i ++)
for(int j = i + 1;j < nums.size();j ++)
if(nums[i] + nums[j] == target){
answer.push_back(i);
answer.push_back(j);
break;
}
return answer;
}
};
运行时间
249ms
改进
在提交的运行时间分布中,本次提交的运行时间排名很落后,于是上网查找,并学习了一种利用map提高效率的算法。
该算法只用遍历一次所有元素,在遍历到每一个元素时,将<目标值与该元素的差,该元素的坐标>放入map中,如此在下面的循环中可通过判断某个元素是否已经存在于map中来判断是否存在两个相加为目标值的元素。该算法的时间复杂度为O(n)。
源程序class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int n = numbers.size();
vector<int> result;
map<int, int> index;
for (int i = 0; i < n; i++) {
if (index.count(numbers[i]) != 0) {
// if exists
result.push_back(index[numbers[i]]);
result.push_back(i);
break;
}
index[target - numbers[i]] = i;
}
return result;
}
};
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int n = numbers.size();
vector<int> result;
map<int, int> index;
for (int i = 0; i < n; i++) {
if (index.count(numbers[i]) != 0) {
// if exists
result.push_back(index[numbers[i]]);
result.push_back(i);
break;
}
index[target - numbers[i]] = i;
}
return result;
}
};
运行时间
15ms