leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标
Posted Ocean:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标相关的知识,希望对你有一定的参考价值。
题目描述
给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标
第一种方法
使用两层循环进行判断,条件成立返回结果
/**
* 方法一:两层循环,比较
* @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");
}
throw new IllegalArgumentException("No two sum solution");
}
以上是关于leetcode刷题(java)-01-给定⼀个数组和⼀个⽬标和,从数组中找两个数字相加等于⽬标和,输出这两个数字的下标的主要内容,如果未能解决你的问题,请参考以下文章
leetcode刷题39.最小操作次数使数组元素相等——Java版
LeetCode Java刷题笔记—349. 两个数组的交集