0X01 题目
Question
Two Sum
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.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
UPDATE (2016/2/13):
The return format had been changed to zero-based indices. Please read the above updated description carefully.
问题
给定一个整数数组,返回和等于指定数值的两个数字的下标。
假设每个输入有且仅有一个结果。
例子:
nums = [2, 7, 11, 15], target = 9,
因为nums[0] + nums[1] = 2 + 7 = 9,
因此返回 [0, 1]。
更新 (2016/2/13): 返回格式更改为以0为起始的下标。
0X02 题意
简单来说,就是给一数组及一数值,求数组中两元素相加为该数值的索引。
0X03 题解
1.暴力破解(Cathy:C++)
双层循环,暴力破解。
时间复杂度:O(n^2)。
空间复杂度:O(1)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
vector<int> res;
for(int i = 0; i < n-1; i++) {
for(int j = i+1; j < n; j++) {
if(nums[i] + nums[j] == target) {
res.push_back(i);
res.push_back(j);
return res;
}
}
}
return res;
}
};
2.使用HashMap(Dante:Java)
使用HashMap,先将所有元素存入HashMap(HashMap中的key是数组中的元素值,value是元素的下标)中,然后遍历原数组,每次循环都用target减去当前遍历到的数值,即diff = target - nums[i]
;,如果HashMap中存在diff,则返回i和hashMap.get(diff)。
时间复杂度:O(n)
空间复杂度:O(n)
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
Map<Integer, Integer> hashMap = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
hashMap.put(nums[i], i);
}
int diff;
for(int i = 0; i < nums.length; i++) {
diff = target - nums[i];
if (hashMap.containsKey(diff)) {
if(i == hashMap.get(diff)) {
continue;
}
res[0] = i;
res[1] = hashMap.get(diff);
return res;
}
}
return res;
}
}
2016-08-01 14:18:20 hzct