题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
复制代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
//面向过程的解法;这是最直接的思路。
int* twoSum(int* nums, int numsSize, int target) {
int *a=(int *)malloc(2*sizeof(int));
//外层index从0开始遍历
int index = 0;
while (index < numsSize - 1) {
//内层从外层当前下标index的下一个元素开始遍历即i= index + 1
int i = index + 1;
while (i < numsSize) {
//判断两个元素之和是否等于target,如果相等,保存值并返回。
if (*(nums + i) + *(nums + index) == target) {
*(a + 0)= index;
*(a + 1) = i;
return a;
}
i ++;
}
index ++;
}
return a;
}
复制代码
//思路升级
//c++ 哈希map 空间换时间
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> valueMap;
for (int i = 0 ; i < nums.size(); i++) {
int searchValue = target - nums[i];
map<int,int>::iterator it ;
//通过value查找是否存在,该操作时间复杂度为O(1);
it = valueMap.find(searchValue);
if (it != valueMap.end()) {
vector<int> collect;
collect.push_back(valueMap[searchValue]);
collect.push_back(i);
return collect;
}
valueMap.insert(pair<int, int>(nums[i],i));
}
vector<int> collect;
return collect;
}
};
复制代码
小结:
- 该题难度不大,直接使用面向过程的方法就能求解。
- 该问题步骤分解中,因为已知和以及其中一个加数求另外一个加数,转换到程序中就是一个查找的问题->一个已知集合查找特定值得问题.
一个已知集合查找特定值得问题,会直接导致两种思路:
- 遍历查找->优化遍历方法
- 空间换时间->哈希查找(这里会产生一种数据结构,它会把一个数值和数值的索引存储【起到存储的作用】,并能快速通过索引查找到对应的数值。另外由于不存在相同索引,所以可以【存储同一索引最后状态的值】,这个性质可以对某类问题做优化,例如最长不重复字符子串问题,通过值替换能保存相同字符的最后位置j(当前位置),假设被替换前的值为i ,那么当前子串长度len = j - i )。
思维路线: ->常规思路是否可解; ->是否存查找问题->是否可以使用空间换时间(哈希查找,备忘录等)
待完善....