博客
关于我
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/

    你可能感兴趣的文章
    Node.js 之 log4js 完全讲解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 函数计算如何突破启动瓶颈,优化启动速度
    查看>>
    Node.js 切近实战(七) 之Excel在线(文件&文件组)
    查看>>
    node.js 初体验
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    Node.js 模块系统的原理、使用方式和一些常见的应用场景
    查看>>
    Node.js 的事件循环(Event Loop)详解
    查看>>
    node.js 简易聊天室
    查看>>
    Node.js 线程你理解的可能是错的
    查看>>
    Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js中环境变量process.env详解
    查看>>
    Node.js之async_hooks
    查看>>