思路就是假如你拿到1 而k=2 然后此时你只能匹配 -1 或 3 这两个数,然后你就去匹配,然后如果存在,那么就标识他们两个数 比如找到了3 那么 (1,3)或(3,1)就应该被存储起来。
执行用时: 1407 ms
内存消耗: 41.3 MB
暴力
public int findPairs(int[] nums, int k) {
int count = 0;
ArrayList<Integer> a = new ArrayList<>();
if (k == 0) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (Math.abs(nums[i] - nums[j]) == k && !a.contains(nums[i])) {
count++;
a.add(nums[i]);
}
}
}
} else {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (Math.abs(nums[i] - nums[j]) == k && !a.contains(nums[i]) && !a.contains(nums[j])) {
count++;
a.add(nums[i]);
}
}
}
}
return count;
}
执行用时: 560 ms
内存消耗: 42 MB
结合map存储你已经有过的组合
public int findPair2(int[] nums, int k) {
int count = 0;
HashMap<Integer, List<Integer>> map = new HashMap<>();
int len = nums.length;
for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) {
if (Math.abs(nums[i] - nums[j]) == k) {
List<Integer> list1 = map.getOrDefault(nums[i], new ArrayList<>());
List<Integer> list2 = map.getOrDefault(nums[j], new ArrayList<>());
if (list1.isEmpty() || !list1.contains(nums[j])) {
count++;
//
list1.add(nums[j]);
map.put(nums[i], list1);
//
list2.add(nums[i]);
map.put(nums[j], list2);
}
}
}
}
return count;
}
执行用时: 17 ms
内存消耗: 43.5 MB
受到三数之和启示 使用map-k或+k 来简化for循环
public int findPair3(int[] nums, int k) {
int count = 0;
HashMap<Integer, List<Integer>> map = new HashMap<>();
int len = nums.length;
ArrayList<Integer> a = new ArrayList<>();
if (k == 0) {
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (Math.abs(nums[i] - nums[j]) == k && !a.contains(nums[i])) {
count++;
a.add(nums[i]);
}
}
}
} else {
for (int i = 0; i < len; i++) {
int abs = nums[i] + k;
List<Integer> list1 = map.getOrDefault(nums[i], new ArrayList<>());
if (map.containsKey(abs)) {
List<Integer> list2 = map.getOrDefault(abs, new ArrayList<>());
if (list1.isEmpty() || !list1.contains(abs)) {
count++;
//添加 例如 你当前元素为 1 选中另一个元素为 2 那么就放进去 1 ==》 2
list1.add(abs);
map.put(nums[i], list1);
//这个跟上面一样 2==》1
list2.add(nums[i]);
map.put(abs, list2);
}
} else {
if (!map.containsKey(nums[i]))
map.put(nums[i], new ArrayList<>());
}
int ab = nums[i] - k;
if (map.containsKey(ab)) {
List<Integer> list2 = map.getOrDefault(ab, new ArrayList<>());
if (list1.isEmpty() || !list1.contains(ab)) {
count++;
//
list1.add(ab);
map.put(nums[i], list1);
//
list2.add(nums[i]);
map.put(ab, list2);
}
}
}
}
return count;
}