个人技术分享

1、(最接近的三数之和):

这段代码是解决“最接近的三数之和”问题。它提供了一个Java类Solution,其中包含一个方法threeSumClosest,该方法接收一个整数数组nums和一个目标整数target。任务是找到一个由三个数组元素组成的和,这个和要尽可能接近target

代码首先对数组进行排序,然后初始化一个变量diff来记录当前最接近target的三数之和的差值,以及一个变量ans来保存最接近的三数之和。

接着,代码使用三重循环来尝试找到最接近target的三数之和。对于数组中的每个元素nums[i],代码尝试在i+1n-1之间找到两个元素,使得这三个元素的和尽可能接近target。如果找到的三数之和与target的差值小于当前记录的diff,则更新diffans

最后,返回变量ans作为最接近target的三数之和。

2、(三数之和):

这段代码是解决“三数之和”问题。它提供了一个Java类Solution,其中包含一个方法threeSum,该方法接收一个整数数组nums。任务是找出数组中所有唯一的三元组,使得这些三元组的和为0。

代码首先对数组进行排序,然后初始化一个ArrayList来保存结果。

接着,代码使用三重循环来找到所有和为0的三元组。对于数组中的每个元素nums[i],代码尝试在i+1len-1之间找到两个元素,使得这三个元素的和为0。如果找到,则将这个三元组添加到结果列表中,并更新左右指针leftright来跳过重复的元素。

最后,返回包含所有和为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;
    }
}