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;
}
複製代碼