在这个系列中给大家分享一些平常见到的算法题,以及自己的答案。
Question:
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
假设有一个整数数组,请返回数组中两个整数的索引,这两个整数相加需要等于一个特定的值。注意,每个给定的数组中有且只有一对符合条件的整数,同时数组中的每个元素只能使用一次。
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
Answer Template:
class Solution {
public int[] twoSum(int[] nums, int target) {
//your solution here
}
}
Solution 1:
public int[] twoSum(int[] nums, int target) {
for(int i=0; ifor(int j=i+1; jif(nums[i] + nums[j] == target) {
return new int[]{i,j};
}
}
}
throw new IllegalArgumentException("给定数组中没有满足条件的两个数");
}
这种方法比较简单容易被想到,两层for循环遍历,时间复杂度是O(n2)
Solution 2:
public int[] twoSum(int[] nums, int target) {
HashMap map = new HashMap<>();
for(int i=0; iif(map.containsKey(target-nums[i])) {
return new int[] {map.get(target-nums[i]), i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("给定数组中没有满足条件的两个数");
}
第二种解决方案使用了HashMap数据结构,只需要遍历一次,时间复杂度为O(n)
博主进行取10000个整数的数组{1,2,3, … , 10000} target = 19999做测试,第一种方法需要22ms,第二种方法只需要5ms。
以下是我的测试用例代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] input = new int[10000];
for(int i=1; i<=10000; i++) {
input[i-1] = i;
}
new Thread(()->{
long time =ExecutionTimeAnalyzer.getExecutionTime(() -> {
System.out.println(Arrays.toString(twoSum(input, 19999)));
});
System.out.println(time+"ms");
}).start();
new Thread(()->{
long time =ExecutionTimeAnalyzer.getExecutionTime(() -> {
System.out.println(Arrays.toString(twoSum2(input, 19999)));
});
System.out.println(time+"ms");
}).start();
}
public class ExecutionTimeAnalyzer {
public static long getExecutionTime(CodeExecutor ce) {
long startTime = System.currentTimeMillis();
ce.execute();
long endTime = System.currentTimeMillis();
return (endTime-startTime);
}
}
@FunctionalInterface
public interface CodeExecutor{
void execute();
}
运行结果为:
[9998, 9999]
5ms
[9998, 9999]
22ms
本节博客的源码全部放在这里,欢迎大家下载,下载后记得修改源码中的package名字哦。