博客
关于我
L15,L16三数之和
阅读量:215 次
发布时间:2019-02-28

本文共 2365 字,大约阅读时间需要 7 分钟。

三数之和问题分为两个部分:判断是否存在三个数之和为零,以及找到和目标最接近的三数之和。以下是详细的解决方案和代码实现。

三数之和为零的判断

方法思路

  • 排序数组:首先对数组进行排序。排序可以帮助我们利用双指针技巧,有效地减少重复计算。
  • 双指针遍历:选择第一个数后,使用两个指针分别从数组的后端和中间开始遍历。通过调整这两个指针的位置,可以找到满足条件的三元组。
  • 记录结果:记录所有满足条件的三元组,确保不重复。
  • 代码实现

    import java.util.ArrayList;import java.util.List;public class Solution {    public List
    > threeSum(int[] nums) { List
    > result = new ArrayList<>(); if (nums == null || nums.length < 3) { return result; } Arrays.sort(nums); List
    > tempResult = new ArrayList<>(); for (int i = 0; i < nums.length - 2; i++) { List
    current = new ArrayList<>(); current.add(nums[i]); int j = i + 1; int k = nums.length - 1; while (j < k) { int sum = nums[i] + nums[j] + nums[k]; if (sum == 0) { current.add(nums[j]); current.add(nums[k]); tempResult.add(current); // 跳过重复的元素 while (j < k && nums[j] == nums[j + 1]) { j++; } while (k > j && nums[k] == nums[k - 1]) { k--; } j++; k--; } else if (sum > 0) { k--; } else { j++; } } } // 去除重复的三元组 for (List
    list : tempResult) { result.add(list); } return result; }}

    最接近目标值的三数之和

    方法思路

  • 排序数组:同样对数组进行排序,以便利用双指针技巧。
  • 遍历数组:使用双指针遍历数组,计算当前三元组的和与目标值的差距。
  • 跟踪最接近值:在遍历过程中,记录最接近目标值的三元组和。
  • 代码实现

    public class Solution {    public int threeSumClosest(int[] nums, int target) {        if (nums == null || nums.length < 3) {            return -1;        }        Arrays.sort(nums);        int closest = nums[0] + nums[1] + nums[2];        int len = nums.length;        for (int i = 0; i < len - 2; i++) {            int j = i + 1;            int k = len - 1;            while (j < k) {                int sum = nums[i] + nums[j] + nums[k];                int diff = Math.abs(sum - target);                int currentDiff = Math.abs(closest - target);                if (diff < currentDiff) {                    closest = sum;                } else if (diff == currentDiff) {                    closest = Math.max(closest, sum);                }                if (sum < target) {                    j++;                } else if (sum > target) {                    k--;                } else {                    return sum;                }            }        }        return closest;    }}

    总结

    通过对数组排序和双指针遍历的方法,我们能够高效地解决这两个问题。首先,排序数组帮助我们快速定位可能的三元组,双指针则有效地减少了搜索空间。同时,我们记录了所有满足条件的三元组,确保结果的准确性和唯一性。在处理最接近目标值的问题时,我们在遍历过程中动态地更新最接近值,保证了算法的高效性。

    转载地址:http://bcvp.baihongyu.com/

    你可能感兴趣的文章
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>
    Plotly:如何使用 updatemenus 更新一个特定的跟踪?
    查看>>
    Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
    查看>>
    Plotly:如何向烛台图添加交易量
    查看>>
    Plotly:如何在 plotly express 中找到趋势线的系数?
    查看>>
    Plotly:如何在桑基图中设置节点位置?
    查看>>
    Plotly:如何处理重叠的颜色条和图例?
    查看>>
    Plotly:如何手动设置 plotly express 散点图中点的颜色?
    查看>>
    Plotly:如何结合 make_subplots() 和 ff.create_distplot()?
    查看>>
    Plotly:如何绘制累积的“步骤“;直方图?
    查看>>
    Quartz进一步学习与使用
    查看>>
    Plotly条形图-根据正/负值更改颜色-python
    查看>>
    PLSQL developer12安装图解
    查看>>
    PLSQL Developer调试 存储过程和触发器
    查看>>
    PLSQL window操作
    查看>>
    plsql 存储过程 测试
    查看>>