0
点赞
收藏
分享

微信扫一扫

算法学习之 Java 实现-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标


算法学习之 Java 实现-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标_java

题目描述

算法学习之 Java 实现-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标_java_02

给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标

第一种方法

使用两层循环进行判断,条件成立返回结果

/**
* 方法一:两层循环,比较
* @param arrays 要比较的数组
* @param target 比较的目标
* @return
*/
public static int[] twoSum1(int[] arrays, int target) {
int[] res = new int[2];
for (int i=0; i < arrays.length; i++) {
for (int j=(i + 1); j < arrays.length; j++) {
if (arrays[i] + arrays[j] == target) {
res[0] = i;
res[1] = j;
return res;
}
}
}
return res;
}

时间复杂度:两层for循环,O(n^2)

空间复杂度:O(1)

第二种方法

使用hash table,可以把数组的每个元素保存为 hash 的 key,下标保存为 hash 的 value

public  static int[] twoSum2(int[] arrays, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arrays.length; i ++) {
// key 为数值,value为下标
map.put(arrays[i], i);
}
for (int i = 0; i < arrays.length; i ++) {
int sub = target - arrays[i];
if (map.containsKey(sub) && map.get(sub) != i) {
return new int[]{i, map.get(sub)};
}
}
throw new IllegalArgumentException("No two sum solution");
}

时间复杂度:一层循环 O(1)

空间复杂度:所谓的空间换时间,这⾥就能体现出来, 开辟了⼀个 hash table ,空间复杂度变为 O(n)

第三种方法

将方法二中的两个for循环合在一起,

public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int sub=target-nums[i];
if(map.containsKey(sub)){
return new int[]{i,map.get(sub)};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}

算法学习之 Java 实现-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标_数组_03


举报

相关推荐

0 条评论