leetcode 数组 两数之和
题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
package TwoSum;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
*
* @Auther: 何未了
* @Date: 2020/05/28/8:20
* @Description:
*/
public class exercise {
public static void main(String[] args) {
int[] arr = {2,7,11,9};
int target = 9 ;
int[] result1 = twosum1(arr , target);
int[] result2 = tosum2(arr , target);
int[] result3 = tosum3(arr , target);
System.out.println(Arrays.toString(result2));
System.out.println(Arrays.toString(result2));
System.out.println(Arrays.toString(result3));
}
/**
* 解法一 暴力解法
遍历数组中的每个元素,返回两数的下标
两次for循环 时间复杂度是O(n^2) 空间复杂度O(1)
* @Date: 2020/5/28
*/
public static int[] twosum1(int[] arr , int target){
for(int i = 0 ; i < arr.length ; i++){
for(int j = i+1 ; j < arr.length ; j++){
if(arr[i] + arr[j] == target){
return new int[] {i,j};
}
}
}
throw new IllegalArgumentException("cannot find such number");
}
/****
解法二 两遍哈希表
通过空间换时间
遍历了两遍含有n个元素的哈希表,查找时间是O(1)
时间复杂度是O(n) 空间复杂度是O(n)
第一建立一个哈希表 在哈希表中 存入 数组元素 和 相对应的数组下标
第二遍历哈希表 在哈希表中 寻找 targrt-arr[i] 若存在,则返回
* @Date: 2020/5/28
*/
public static int[] tosum2(int[] arr , int targrt){
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < arr.length ; i++){
map.put(arr[i] , i) ;
}
for(int i = 0 ; i < arr.length ; i++){
int another = targrt - arr[i] ;
//如果哈希表中存在目标值( target-arr[i] ),并且这个值不是 不是arr[i] 本身
if(map.containsKey(another) && map.get(another) != i)
return new int[] {i,map.get(another)};
}
throw new IllegalArgumentException("can not find such number");
}
/*
解法三 一遍哈希表
遍历了一遍含有n个元素的哈希表,查找时间是O(1)
时间复杂度是O(n) 空间复杂度是O(n)
解法二中的两遍哈希表,第一次仅仅是存储值和索引,第二次才是查找目标值
现在将两步合并成为一步 直接将目标值(target-arr[i])进行存储
nums = [2,7,11,15] target = 26
target-arr[i] 26-2=24(不存在) 26-7=19(不) 26-11=15(不) 26-11=15(已存在) 此时返回11的索引 2 和arr[i]的 i值
key 2 7 11
value 0 1 2
* @Date: 2020/5/28
*/
public static int[] tosum3(int[] arr , int target){
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < arr.length ; i++){
int another = target - arr[i] ;
if(!map.containsKey(another))
map.put(arr[i],i);
else
return new int[]{map.get(another),i};
}
throw new IllegalArgumentException("can not find such number");
}
}