前言:刷了几天简单的题找感觉,现在决定按照序号来做题。
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.
首先想到的一个算法是O(n^2)的时间复杂度。Your runtime beats 19.75% of javasubmissions
public class Solution {
public int[] twoSum(int[] nums, int target) {
int i=0,j=1;
boolean flag = true;
for(; i < nums.length - 1; i ++){
for( j = i + 1; j < nums.length; j ++){
if(target == (nums[i] + nums[j])){
flag = false;
break;
}
}
if(!flag) break;
}
return new int[]{i,j};
}
}
时间复杂度O(n);
Your runtime beats 41.62% of javasubmissions.
public class Solution {
public int[] twoSum(int[] nums, int target) {
int i=0,j=0;
HashMap<Integer,Integer> nums_map = new HashMap<Integer,Integer>();
for( ; i < nums.length ; i ++){
if(nums_map.containsKey(nums[i])){nums_map.put(nums[i],nums_map.get(nums[i]) + i);}
else{nums_map.put(nums[i],i);}
}
for(i =0 ; i < nums.length; i ++){
int remainder = target - nums[i];
if(nums_map.containsKey(remainder)){
j = nums_map.get(remainder);
if(remainder == nums[i]) j -= i;
if(j != 0)
break;
}
}
return new int[]{i,j};
}
}
接下来继续思考,是否只要循环一遍就可以了,确实还真可以,因为题目知道存在唯一解。因此我们其实遍历一遍就可以了。
Your runtime beats 91.17% of javasubmissions.
public class Solution {
public int[] twoSum(int[] nums, int target) {
int i=0,j=0;
HashMap<Integer,Integer> nums_map = new HashMap<Integer,Integer>();
for(; i < nums.length; i ++){
int remainder = target - nums[i];
if(nums_map.containsKey(remainder)){
j = nums_map.get(remainder);
break;
}else{
nums_map.put(nums[i],i);
}
}
return new int[]{i,j};
}
}