1. Two Sum
Question
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].1.两个和
问题
给定一个整数数组,返回两个数字的索引,使得它们加起来成为一个特定的目标。
您可以假设每个输入都有一个解决方案,您不能使用相同的元素两次。
例:
给定nums = [2,7,11,15],target = 9,
因为nums [0] + nums [1] = 2 + 7 = 9,
return [0,1]。这是LeeCode的第一题,Easy难度,但凡是算法的题,不仅需要标准的输入输出,有的时候,我们更应该考虑的是解决方案的时间复杂度与空间复杂度。
(以下程序用的都是qt)
1.暴力解法,两个for循环遍历数组,将所有情况加一般,空间复杂度O(1),时间复杂度O(n2)。
QVector<int> twoSum(QVector<int> &numbers,int target) { QVector<int> result; for(int i=0;i<numbers.count();i++) { for(int j=i;j<numbers.count();j++) { if(numbers[i]+numbers[j]==target) { result.append(i); result.append(j); return result; } } } return result; }
2.先对数组进行排序,然后在进行查找,时间复杂度:O(nlogn)(取决于排序时间复杂度),空间复杂度:O(n)(取决于排序空间复杂度以及备份数组的空间复杂度)
QVector<int> twoSum(QVector<int> &numbers,int target) { QVector<int> result; if (numbers.size() < 2) return result; //进行排序 qSort(numbers.begin(), numbers.end()); int i=0,j=numbers.count()-1; while(i<j) { if(numbers.at(i)+numbers.at(j)==target) { result.append(numbers.at(i)); result.append(numbers.at(j)); break; } else if(numbers.at(i)+numbers.at(j)>target) { j--; } else if(numbers.at(i)+numbers.at(j)<target) { i++; } } return result; }
3.存入hash表,然后进行查找 时间复杂度为O(n),空间复杂度也是O(n),典型的时空权衡,通过付出一定的空间,大大的提高了运行的速度
QVector<int> twoSum(QVector<int> &numbers,int target) { QVector<int> result; QMap<int, int> map; if (numbers.size() < 2) return result; //将number数组中的各项装入map中 for (int i = 0; i < numbers.size(); i++) map[numbers[i]] = i; QMap<int, int>::iterator it; for (int i = 0; i < numbers.size(); i++) { if ((it = map.find(target - numbers[i])) != map.end()) { if (i == it.value()) continue; result.push_back(i+1); result.push_back(it.value()+1); return result; } } return result; }