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

    你可能感兴趣的文章
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>