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].
难度:easy
解析:在给定数组之中,得到两个数字,这两个数字之和等于给定数字,返回两数字的序号下标。由于题干中已经表明有且只有一组解,因此不用考虑很多异常情况,只需得到该答案即可。
方法一:穷举遍历(★★★)
最简单的方法就是穷举遍历,计算所有数字两两之和,直至得到答案。
class Solution {
public int[] twoSum(int[] nums, int target) {
for ( int i = 0 ; i < nums.length ; i++){
for ( int j = i + 1 ; j < nums.length ; j++){
if(nums[i] + nums[j] == target){
return new int[] {i,j};
}
}
}
return null;
}
}
结果:Runtime: 26 ms,beats 33.69% of Java submission.
备注:遍历数组,时间复杂度O(n^2),显然这个操作很一般。
方法二:Map筛选(★★★★)
添加map作为筛选条件。遍历给出的数组,对于任意数字nums[i],如果map中不包含nums[i],则将键值对(target-nums[i],i)置于map中,如果map中包含nums[i],则{i,map.get(nums[i])}为所求答案。
因为有且仅有一组解,假设a1,a2为这组解,则a1会先置于map中,且键值对为(target-nums[a1],a1),当遍历到nums[a2]时,可知map包含nums[a2](即 nums[a2] == target-nums[a1]),故可得答案为数组{a1,a2}。
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap map = new HashMap();
for( int i = 0 ; i < nums.length ; i++){
if(map.containsKey(nums[i])){
return new int[] { map.get(nums[i]) ,i};
}else{
map.put((target - nums[i]),i);
}
}
return null;
}
}
结果:Runtime: 4 ms,beats 90.71% of Java submission.
备注:遍历数组,时间复杂度O(n),同时使用HashMap进行key-value寻值,寻找这个唯一解。
方法三:数组筛选(★★★★★)----所有用户提交通过的答案中的最佳方法之一
此方法和方法二的思路基本一致,只不过方法二是使用map进行寻值,此方法是使用数组进行寻值。其主要思路如下,新建一个数组arr,保存未寻得配对的数字,保存方式:arr[ nums[ i ] ] = i。
遍历原数组nums,对于原数组任一数字nums[ i ],前往arr中寻值,如果arr[ target - nums[ i ] ] > 0,则代表目标值寻得,答案为{ i ,arr[ target - nums[ i ] ] },如果arr[ target - nums[ i ] ] == 0,为默认值,则代表目标值未插入arr,将当前值插入arr中。
备注:此方法有几个注意点,
(1)diff&max,nums[i]&max,这两处且运算是为了防止diff和nums[i]大于2048导致超界无法插入arr中;
(2)“ 如果arr[ target - nums[ i ] ] == 0,为默认值,则代表目标值未插入arr ”,这一结论并非绝对正确的,可能0就是目标值的位置,而不是默认值0,所以需要在一开始对nums[0]进行判断之后,arr[ target - nums[ i ] ] == 0才可以认为是默认值0.
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arr=new int[2048];
int max=arr.length-1;
int first=nums[0];
for(int i=1;i
结果:Runtime: 1 ms,beats 99% of Java submission.
备注:遍历数组,时间复杂度O(n),同时使用数组进行寻值,寻找这个唯一解。