(有人相爱,有人夜里开车看海,有人却连LeetCode第一题都做不出来)
下面是两数之和的几种做法,执行时间由慢到快
1.List集合求解
//执行时间大约180ms
public static int[] twoSum(int[] nums, int target) {
int[] indexes = new int[2];
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(list.contains(nums[i])){
indexes[0]=list.indexOf(nums[i]);
indexes[1]=i;
return indexes;
}
list.add(target-nums[i]);
}
return indexes;
}
2.暴力求解
//执行时间大约40ms
public static int[] twoSum(int[] nums, int target) {
int[] indexes = new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
indexes[0]=i;
indexes[1]=j;
break;
}
}
}
return indexes;
}
3.Map集合求解
//执行时间1ms
public static int[] twoSum(int[] nums, int target) {
int[] indexes = new int[2];
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
indexes[1] = i;
indexes[0] = map.get(nums[i]);
return indexes;
}
map.put(target - nums[i], i);
}
return indexes;
}
以上就是三种求解两数之和的方法,List集合和Map集合求解的方式有些类似,List集合如此之慢的原因是因为你不清楚要找的元素下标究竟是多少,因此只能通过迭代内部全部元素,然后进行条件判断查找,而Map则不需要迭代,因为Map是Key-Value结构且一一对应,可以直接通过对应的key获取到value