三指针解决hashmap问题

- 注意重复指针跳过的方法
This commit is contained in:
whai 2024-01-03 22:13:32 +08:00
parent bdbfa1854c
commit 93cbd6955c

View File

@ -0,0 +1,68 @@
package cn.whaifree.leetCode.Hash;
import org.junit.Test;
import java.util.*;
import java.util.function.Consumer;
public class LeetCode15 {
@Test
public void test() {
new Solution().threeSum(new int[]{-1, 0, 1, 2, -1, -4}).forEach(integers -> {
System.out.println();
integers.forEach(
integer -> System.out.print(integer + " ")
);
});
}
class Solution {
/**
* TODO 2024-1-3 用三指针没做出来
* @param nums
* @return
*/
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> o = new ArrayList<>();
// 排序后第一个就大于0必然不可能有结果
if (nums[0] > 0) {
return o;
}
for (int i = 0; i < nums.length; i++) {
int left = i + 1;
int right = nums.length - 1;
// 如果前后两个i 相同跳过
if (i > 0 && nums[i] == nums[i - 1]) { // 去重a
continue;
}
while (left < right) {
int number = nums[i] + nums[right] + nums[left];
if (number > 0) {
right--;
} else if (number < 0) {
left++;
} else {
o.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 去重逻辑应该放在找到一个三元组之后对b c去重
// 如果 right左边的两个一样去重跳过去但依然要保证要比left大
while (right > left && nums[right] == nums[right - 1]){
right--;
}
while (right > left && nums[left] == nums[left + 1]) {
left++;
}
right--;
left++;
}
}
}
return o;
}
}
}