题目
解法
package 力扣;
import java.util.HashMap;
import java.util.Map;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-11-04-15-03
*/
public class 两数之和 {
//自己的方法我就不写注释了
public static int[] twoSum(int[] nums,int target){
int length = nums.length;
int bz = 0;
int[] a = new int[2];
for (int i = 0; i < length - 1; i++) {
for(int j=i+1;j<length;j++){
if(nums[i]+nums[j]==target){
a[0]=i;
a[1]=j;
bz=1;
}
}
if(bz==1){
break;
}
}
return a;
}
//方法一:暴力枚举
//思路及算法
//最容易想到的方法是枚举数组中的每一个数x,寻找数组中是否存在target - x.
//当我们使用遍历整个数组的方式寻找target - x时,需要注意到每一个位于x 之前的元素都已经和x匹配过
//因此不需要在进行匹配。而每一个元素不能使用两次,所以我们只需要在x后面的元素中寻找target - x
public static int[] twoSum2(int[] nums,int target){
int n = nums.length;
for (int i = 0; i < n; i++) {
for(int j = i+1;j<n;j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return new int[0];
}
//复杂度分析
//时间复杂度:O(N方),其中N是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次
//空间复杂度:O(1)
//方法二:哈希表
//思路及算法
//注意到方法一的时间复杂度较高的原因是寻找target - x的时间复杂度过高。因此,我们需要一种更优秀的方法,
//能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
//使用哈希表,可以将寻找target - x 的时间复杂度降低到从O(N)降低到O(1).
//这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在target - x,然后将x插入到哈希表中
//即可保证不会让x和自己匹配
public static int[] twoSum3(int[] nums,int target){
Map<Integer,Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
if(hashtable.containsKey(target-nums[i])){
return new int[]{hashtable.get(target-nums[i]),i};
}
hashtable.put(nums[i],i);
}
return new int[0];
}
//复杂度分析
//时间复杂度:O(N),其中N是数组中的元素数量。对于每一个元素x,我们可以O(1)地寻找target - x.
//空间复杂度:O(N),其中N是数组中的元素数量。主要为哈希表的开销。
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6};
int target = 9;
int[] b = new int[2];
b = twoSum3(a,target);
for (int i = 0; i < 2; i++) {
System.out.print(b[i]+" ");
}
}
}