本算法来源于leetCode的一道题目 《两数之和》(简单难度)
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
列如:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
代码如下
public static int[] twoSum(int[] nums, int target) {
int i = 0;//从第0位开始遍历
while (true){
for (int j = 1;j < nums.length;j++){
if (i+j >= nums.length)break;
//逐一相加寻找target
if (nums[i] + nums[i+j] == target)
return new int[] {i,i+j};
}
i++;
}
但是这样的话空间复杂度就会增加
这时就可以使用哈希链表的方式解决,思路是对于每一个 x
,我们首先查询哈希表中是否存在 target - x
,然后将 x
插入到哈希表中,即可保证不会让 x
和自己匹配。
public int[] twoSum(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];
}
这样就会极大的提升执行速度