1.给一个整形数组列表,以及一个目标值,找出这个列表的两个数值,使得加起来的总和等于目标值,如下有各类用到的list,map,数组等数据结构,从中能够对比下那种数据结构的内存耗用以及查找速度更快?
//测试数据 [3,2,4]
//6
//耗时43 ms 内存占用38.6 MB
public int[] twoSum(int[] nums, int target) {
for (int i = 0, size = nums.length; i < size; i++) {
int left = target - nums[i];
//1.查找left在剩余的数字中位置
for (int j = size - 1; j > i; j--) {
if (left == nums[j]) {
return new int[]{i, j};
}
}
}
return null;
}
//耗时112 ms 内存占用36.1 MB
public int[] twoSum2(int[] nums, int target) {
List<Integer> listNums = Arrays.stream(nums).boxed().collect(Collectors.toList());
for (int i = 0, size = listNums.size(); i < size; i++) {
int left = target - listNums.get(i);
int index = listNums.indexOf(left);
if (index != -1 && i != index) {
return new int[]{i, index};
}
}
return null;
}
//耗时2 ms 内存占用39.3 MB
public int[] twoSum3(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {//map.containsKey是根据数组的下标进行索引,时间复杂度为O(n)
return new int[]{map.get(complement), i};
}
map.put(nums[i], i);
}
return null;
}
复制代码