难度:easy
1、题目介绍
2、思路分析
一、第一种解法:暴力解法,时间复杂度:
通过移动俩个指针 i 和 j ,不断将 i 和 j 所指向的元素进行相加,如果等于9增加到 int[] rets数组中去
代码:
public static int[] twoSum(int[] nums, int target) {
int[] rets;
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};
}
}
}
throw new RuntimeException("two sum solution");
}
※ 注意:
int j = i + 1 : 注意,避免与自己想加,j 指针总是指向 i 指针的后一个元素
二、第二种解法:查找表法,时间复杂度:
通常查找表法有俩种常用的实现方法:1、哈希表 2、平衡二叉搜索树
这个题目并不需要要维护表中数据,所以使用哈希表即可
将 nums数组中元素作为哈希表中key,下标作为value。通过target - nums[i] 来确定另一个符合规则的元素的key。将符合的俩个key增加到数组中
代码:
public static int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> hashTable = new HashMap<>();
int[] rets ;
for (int i = 0; i < nums.length; i++) {
if (hashTable.containsKey(target-nums[i])){
return new int[]{i,hashTable.get(target-nums[i])};
}
//不符合规则,继续放入其他元素
hashTable.put(nums[i],i);
}
throw new RuntimeException("two sum solution");
}
※注意:
哈希表里面的key是元素值,value是元素下标。而返回的是元素下标
由于哈希表中的key都是数字【哈希值就是本身】不存在哈希碰撞问题