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 i,j;
int max=numbers[0];
int min=numbers[0];
vector<int> ret;
for (i=0; i<numbers.size(); i++)
{
if (numbers[i]>max)
max=numbers[i];
else if (numbers[i]<min)
min=numbers[i];
}
for (i=0; i<numbers.size()-1; i++)
{
int meet=target-numbers[i];
if (meet<min || meet > max)
continue;
for (j=i+1; j<numbers.size(); j++)
{
if (numbers[j]==meet)
{
ret.push_back (i+1);
ret.push_back (j+1);
return ret;
}
}
}
}
};
直接用两层循环过不了大集合,先求出有解得边界范围,是比较有效的剪枝,但复杂度仍是O(n^2)。
用哈希表可以降低复杂度到O(n)
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int n=numbers.size();
vector<int> res;
if (n<2) return res;
map<int, int> m;
for (int i=0; i<n; i++) {
int temp = target-numbers[i];
if (m.find(numbers[i])==m.end()) {
m.insert(pair<int, int>(temp, i));
}else {
res.push_back(m[numbers[i]]+1);
res.push_back(i+1);
return res;
}
}
}
};
本文探讨了在给定一个整数数组和一个目标值的情况下,寻找数组中两个数相加等于目标值的问题。通过使用两层循环进行基础实现,并进一步采用哈希表将时间复杂度降低至O(n),提高了算法效率。
954

被折叠的 条评论
为什么被折叠?



