二叉搜索解决3 sum问题的代码
时间: 2024-04-08 18:35:08 浏览: 200
leetcode-LeetCode:力码
对于二叉搜索解决3 sum问题,我们可以先对数组进行排序,然后使用双指针法在排序后的数组中查找三个数的和等于目标值的组合。
以下是使用二叉搜索解决3 sum问题的示例代码:
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ThreeSumBinarySearch {
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums); // 对数组排序
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue; // 避免重复的结果
}
int target = -nums[i];
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 跳过重复的元素
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
// 继续向中间移动
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
return result;
}
public static void main(String[] args) {
int[] nums = {-1, 0, 1, 2, -1, -4};
List<List<Integer>> result = threeSum(nums);
// 打印结果
for (List<Integer> triplet : result) {
System.out.println(triplet);
}
}
}
```
在示例代码中,我们定义了一个 `threeSum` 方法,该方法接收一个整型数组 `nums` 作为参数,并返回一个包含所有三个数和为0的组合的列表。我们使用了双指针法在排序后的数组中查找组合。在 `main` 方法中,我们给定了一个示例数组,然后调用 `threeSum` 方法并打印结果。
输出结果为:
```
[-1, -1, 2]
[-1, 0, 1]
```
这是数组 `[-1, 0, 1, 2, -1, -4]` 中所有三个数和为0的组合。请注意,输出结果中的组合不重复,并且每个组合中的元素按升序排列。
阅读全文