题目:给一个数组a[n]以及一个给定值target,返回数组中的两个数的位置,使其之和等于给定值
思路:1、暴力法搜索,两个for循环依次选取两个值进行判断,匹配则停止并输出。for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){panduan'...}};时间复杂度O(n2)不过这种方法会超时。
2、以空间换时间,用一个map,key为数组的值,value为值的位置,一次循环遍历,如果target-a[i]不在map中,则将当前值放入map,否则可以直接输出,时间负责度:O(N),空间复杂度:O(N)
class Solution {
public:
//时间复杂度:O(n),单次遍历
//空间复杂度:O(n),nmap随输入数组大小变化
//思路:;利用一个map,map中存的值为<当前值,在数组中位置>,遍历数组,(1)如果target-当前值未在map中,则将当前值放入map中
//(2)如果当前值已经在map中,则跳过(在(1)不成立情况下,如果(1)成立则输出两个相同值的位置)
vector<int> twoSum(vector<int> &numbers, int target) {
int i,j;
vector<int> results;
map<int,int> nmap;
for(i=0;i<=numbers.size()-1;i++){
if(!nmap.count(numbers[i])){
if(nmap.count(target-numbers[i])){
results.push_back(nmap[target-numbers[i]]+1);
results.push_back(i+1);
break;
}
else{
nmap.insert(pair<int, int>(numbers[i], i));
}
}
else if(nmap[numbers[i]]<i&&(numbers[i]*2==target)){
results.push_back(nmap[target-numbers[i]]+1);
results.push_back(i+1);
break;
}
}
return results;
}
};