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 <= 1000int 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=rightwhile (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只能移动leftif (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;}
}