1、(最接近的三数之和):
这段代码是解决“最接近的三数之和”问题。它提供了一个Java类Solution
,其中包含一个方法threeSumClosest
,该方法接收一个整数数组nums
和一个目标整数target
。任务是找到一个由三个数组元素组成的和,这个和要尽可能接近target
。
代码首先对数组进行排序,然后初始化一个变量diff
来记录当前最接近target
的三数之和的差值,以及一个变量ans
来保存最接近的三数之和。
接着,代码使用三重循环来尝试找到最接近target
的三数之和。对于数组中的每个元素nums[i]
,代码尝试在i+1
和n-1
之间找到两个元素,使得这三个元素的和尽可能接近target
。如果找到的三数之和与target
的差值小于当前记录的diff
,则更新diff
和ans
。
最后,返回变量ans
作为最接近target
的三数之和。
2、(三数之和):
这段代码是解决“三数之和”问题。它提供了一个Java类Solution
,其中包含一个方法threeSum
,该方法接收一个整数数组nums
。任务是找出数组中所有唯一的三元组,使得这些三元组的和为0。
代码首先对数组进行排序,然后初始化一个ArrayList
来保存结果。
接着,代码使用三重循环来找到所有和为0的三元组。对于数组中的每个元素nums[i]
,代码尝试在i+1
和len-1
之间找到两个元素,使得这三个元素的和为0。如果找到,则将这个三元组添加到结果列表中,并更新左右指针left
和right
来跳过重复的元素。
最后,返回包含所有和为0的三元组的列表。
package Code16;
import java.util.Arrays;
import java.util.Scanner;
/**
* @description 最接近的三数之和
* @level 中等
* @url <a href="https://leetcode.cn/problems/3sum-closest/description/">url</a>
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
class Solution {
/**
* 返回最接近target的三数之和
*
* @param nums
* @param target
* @return int
*/
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
//3 <= nums.length <= 1000
int n = nums.length;
//三数之和与target的差值
int diff = Integer.MAX_VALUE;
//结果,最接近的三数和
int ans = 0;
//第一个数
for (int i = 0; i < n; i++) {
//去重
if (i > 0 && nums[i] == nums[i - 1]) continue;
//左右边界
int left = i + 1;
int right = n - 1;
//当i=n-2时,left=right
while (left < right) {
//此时的三数之和
int sum = nums[i] + nums[left] + nums[right];
//与target差值
int curDiff = Math.abs(sum - target);
//如果差值为0,则一定是这组数
if (curDiff == 0) return sum;
//如果差值更小,则更新
if (curDiff < diff) {
diff = curDiff;
ans = sum;
}
//如果sum在target左边,想接近target只能移动left
if (sum < target) left++;
else if (sum > target) right--;
}
}
return ans;
}
}
package Code15;
import java.util.*;
/**
* @description 三数之和
* @level 中等
* @score
* @url <a href="https://leetcode.cn/problems/3sum/description/">...</a>
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//保留结果
List<List<Integer>> ans = new ArrayList<>();
int len = nums.length;
//异常情况
if (nums == null || len < 3) return ans;
//先升序排列,方便去重
Arrays.sort(nums);
for (int i = 0; i < len; i++) {
//nums升序排列的,如果第一位大于0,后面三数之和一定大于0,结束循环
if (nums[i] > 0) break;
//如果跟上一位一样,则去重 继续下一位
if (i > 0 && nums[i] == nums[i - 1]) continue;
//左边界
int left = i + 1;
//右边届
int right = len - 1;
//要找到num[i]能组合的所有nums[left]和nums[right]
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
//添加当前组合
ans.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 < 0) {
left++;
} else if (sum > 0) {
right--;
}
}
}
return ans;
}
}