算法题:16. 最接近的三数之和(Python Java 详解)

news2024/11/22 11:03:19

 

 解题思路

Step1:先对数组排序,然后设置3个指针,指针1遍历范围为(0~数组长度减2)。

Step2:指针1位置确定时,指针1后面的数组元素首位各放置一个指针(指针2、指针3)。

Step3:如果三数之和=target,则返回target值;如果三数之和<target,则将指针2往后移动,如果三数之和>target,则将指针3往前移动。

Step4:当指针2指针3重合时,则将指针1往后移动。

Step5:重复 Step2 到 Step4。直到指针1遍历完。

Java代码

import java.util.Arrays;


public class ThreeSumClosest {
    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.threeSumClosest(new int[]{-1, 2, 1, -4}, 1));
    }
}

class Solution {
    public int threeSumClosest(int[] nums, int target) {

        Arrays.sort(nums);
        int n = nums.length;
        int min_diff = Integer.MAX_VALUE;//当前找到的三数之和与target的最小差值
        int ans = 0;//最小差值对应的三数之和

        int cur_sum = 0;
        int cur_diff = 0;
        for (int i = 0; i < n - 2; i++) {
            //优化一:如果有重复元素则跳过
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            //优化二:如果加上最后面两个数依旧没有target大,则判断一下三数之和之后跳过当前循环
            cur_sum = nums[i] + nums[n - 2] + nums[n - 1];
            if (target >= cur_sum) {
                cur_diff = target - cur_sum;
                if (cur_diff == 0) {
                    return target;
                }
                if (cur_diff < min_diff) {
                    ans = cur_sum;
                    min_diff = cur_diff;
                }
                continue;
            }
            //优化三:前面3个数的和已经>=target,则判断三数之和之后跳出循环
            cur_sum = nums[i] + nums[i + 1] + nums[i + 2];
            if (target <= cur_sum) {
                cur_diff = cur_sum - target;
                if (cur_diff == 0) {
                    return target;
                }
                if (cur_diff < min_diff) {
                    ans = cur_sum;
                }
                break;
            }

            int j = i + 1, k = n - 1;
            while(j < k){
                cur_sum = nums[i] + nums[j] + nums[k];
                if (cur_sum == target) {
                    return target;
                }
                cur_diff = target - cur_sum;
                if (cur_sum < target) {
                    if (cur_diff < min_diff) {
                        ans = cur_sum;
                        min_diff = cur_diff;
                    }
                    j++;
                } else {  //cur_sum > target
                    cur_diff = -cur_diff;
                    if (cur_diff < min_diff) {
                        ans = cur_sum;
                        min_diff = cur_diff;
                    }
                    k--;
                }
            }
        }
        return ans;
    }
}

Python代码

class Solution(object):
    def threeSumClosest(self, nums, target):
        nums = sorted(nums)  # or nums.sort()
        n = len(nums)
        min_diff = float('inf')
        ans = 0
        for i in range(n-2):
            # 优化一:如果有重复元素则跳过
            if i > 0 and nums[i] == nums[i-1]:
                continue
            # 优化二:如果加上最后面两个数依旧没有target大,则判断一下三数之和之后跳过当前循环
            cur_sum = nums[i] + nums[n - 2] + nums[n - 1]
            if target >= cur_sum:
                cur_diff = target - cur_sum
                if cur_diff == 0:
                    return target
                if cur_diff < min_diff:
                    ans = cur_sum
                    min_diff = cur_diff
                continue
            # 优化三:前面3个数的和已经>=target,则判断三数之和之后跳出循环
            cur_sum = nums[i] + nums[i + 1] + nums[i + 2]
            if target <= cur_sum:
                cur_diff = cur_sum - target
                if cur_diff == 0:
                    return target
                if cur_diff < min_diff:
                    ans = cur_sum
                break
            j, k = i + 1, n - 1
            while j < k:
                cur_sum = nums[i] + nums[j] + nums[k]
                if cur_sum == target:
                    return target
                cur_diff = target - cur_sum
                if cur_sum < target:
                    if cur_diff < min_diff:
                        ans = cur_sum
                        min_diff = cur_diff
                    j += 1
                else:
                    cur_diff = -cur_diff
                    if cur_diff < min_diff:
                        ans = cur_sum
                        min_diff = cur_diff
                    k -= 1
        return ans

if __name__ == '__main__':
    sol = Solution()
    print(sol.threeSumClosest([-1, 2, 1, -4], 1))  # 2

完整题目

16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入:nums = [0,0,0], target = 1
输出:0

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -10^4 <= target <= 10^4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

006 Linux 进程的概念 | 获取进程的PID

前言 本文将会向您进程的概念&#xff0c;程序与进程的区别&#xff0c;如何获取进程的标识符-pid 文章重点 1.描述进程——PCB 进程与程序的区别 CPU对进程列表的处理 2.获取进程PID 描述进程-PCB 进程概念 课本概念&#xff1a;程序的一个执行实例或正在执行的程序 内核…

在Flask中实现文件上传七牛云中并下载

在Flask中实现文件上传和七牛云集成 文件上传是Web应用中常见的功能之一&#xff0c;而七牛云则提供了强大的云存储服务&#xff0c;使得文件存储和管理变得更加便捷。在本篇博客中&#xff0c;我们将学习如何在Flask应用中实现文件上传&#xff0c;并将上传的文件保存到七牛云…

Java NIO 编程

1. 简介 Java NIO 是 JDK 1.4 中引入的新的 IO 方式&#xff0c;它主要包含 Buffer、Channel、Selector 这三个核心的组件&#xff0c;它与传统 IO 的区别如下&#xff1a; NIO IO 面向缓冲 面向流 同步非阻塞 同步阻塞 多路复用&#xff08;选择器&#xff09; 无 1.1…

【自动控制原理】时域分析法:一阶、二阶、高阶系统的时间响应及动态性能

文章目录 第3章 时域分析法3.1 基本概念3.1.1 典型输入信号3.1.2 系统动态性能指标 3.2 一阶系统的时间响应及动态性能一阶系统的标准形式&#xff08;尾1标准型&#xff09;3.2.1一阶惯性环节的单位阶跃响应3.2.2一阶惯性环节的单位速度响应3.2.3一阶惯性环节的单位脉冲响应3.…

乌班图 Linux 系统 Ubuntu 23.10.1 发布更新镜像

Ubuntu 团队在其官网上发布了Ubuntu 23.10.1 版本,这是目前较新的 Ubuntu 23.10(Focal Fossa)操作系统系列的第一个发行版,旨在为社区提供最新的安装媒体。Ubuntu 22.04 LTS(Focal Fossa)操作系统系列于 2022 年 4 月 21 日发布。 Ubuntu 23.10 LTS(长期支持版本)可用…

Redis常见风险分析

击穿 概念&#xff1a;在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。 引发击穿的原因&#xff1a; 第一次访问恶意访问不存在的keyKey过期 合理的规避方案&#xff1a; 服务器启动时, 提前写入规范key的命名, 通过中间件拦截对…

5G及其后的5G非地面网络:趋势和研究挑战-HARQ部分

NTN组件纳入5G架构第一步 在NTN SI中定义了一组架构选项。就NT部分而言&#xff0c;已确定了两大类&#xff1a;星载&#xff08;即基于卫星的通信平台&#xff09;和机载&#xff08;即HAPS&#xff09;设备 并行管理HARQ最大进程数 NHARQRTT(NTX−1)2μ NTX&#xff1a;传输…

物理内存的组织形式

由于物理地址是连续的&#xff0c;页也是连续的&#xff0c;每个页大小也是一样的。因而对于任何一个地址&#xff0c;只要直接除一下每页的大小&#xff0c;很容易直接算出在哪一页。每个页有一个结构 struct page 表示&#xff0c;这个结构也是放在一个数组里面&#xff0c;这…

11.1~11.2双端口RAM(报错复盘,一些理解(循环,阻塞非阻塞),三目运算符解决使能端)

双端口RAM 分别用于读写数据&#xff0c;同时进行 当读使能端有效时可以读出来数据 当写使能端有效时可以覆写数据 读写并行操作 报错 1.reg必须在always里 这个不能assign,因为reg型不能assign&#xff0c;单端口的那个可以assign是因为其定义为了wire型&#xff0c;就不…

【LeetCode刷题-链表】--1290.二进制链表转整数

1290.二进制链表转整数 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }*…

JavaScript 基础 - 第2天

理解什么是流程控制&#xff0c;知道条件控制的种类并掌握其对应的语法规则&#xff0c;具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 运算符 算术运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经…

【window系统】win10家庭版没有hyper-V的选项 问题解决办法

目录 事件起因环境和工具操作过程参考内容结束语 事件起因 在给我的新电脑安装docker和对应的Linux环境时 在 控制面版-程序-启用该或关闭Windows功能 时 没有找到对应网上那种教程里的Hyper-V的功能的选项&#xff0c;查找了一下&#xff0c;说是win10家庭版没有这个功能 专…

NEFU数字图像处理(5)图像压缩编码

一、概述 1.1简介 图像压缩编码的过程是在图像存储或传输之前进行&#xff0c;然后再由压缩后的图像数据&#xff08;编码数据&#xff09;恢复出原始图像或者是原始图像的近似图像 无损压缩&#xff1a;在压缩过程中没有信息损失&#xff0c;可由编码数据完全恢复出原始图像有…

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别&#xff1b; 2. OSPF协议通信过程与部署&#xff1b; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的&#xff1f; - 依靠手动 或…

selenium自动化测试入门 —— 浏览器多窗口切换!

有时web应用会打开多个浏览器窗口&#xff0c;当我们要定位新窗口中的元素时&#xff0c;我们需要将webDriver的handle&#xff08;句柄&#xff09;指定到新窗口。 什么意思&#xff1f; 假设我们打开web应用&#xff0c;在系统运行过程中重新打开一个新窗口&#xff08;可以…

短视频平台Roposo入驻印尼,会成为下一个Tiktok吗

Roposo是一个印度本土的短视频平台&#xff0c;功能和风格都和Tiktok很相似。 早在2020年7月&#xff0c;印度下令封禁了多个app&#xff0c;其中就包括了TikTok。在那之前&#xff0c;TikTok已经在印度累计了约2亿的用户&#xff0c;基数已经非常的大&#xff0c;那么被封禁之…

ESP32网络开发实例-Web服务器显示BMP180传感器数据

Web服务器显示BMP180传感器数据 文章目录 Web服务器显示BMP180传感器数据1、BMP180介绍2、软件准备3、硬件准备4、代码实现本文将介绍如何在ESP32的Web服务器显示BMP180数据。BMP180传感器可用于测量温度、压力和高度。 我们还可以使用此传感器测量海平面和实际高度的压力。 1、…

荒野大镖客emp.dll文件丢失的怎么办,快速修复游戏dll问题

在玩荒野大镖客这款游戏的过程中&#xff0c;我遇到了一个令人困扰的问题——emp.dll文件丢失。emp.dll是荒野大镖客游戏中的一个动态链接库文件&#xff0c;它负责管理游戏中的一些功能模块。当这个文件丢失时&#xff0c;游戏可能无法正常运行&#xff0c;导致一些功能无法使…

Python武器库开发-常用模块之configparser模块(十六)

configparser模块(十六) ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类&#xff0c;该模块的作用就是用来读取配置文件的&#xff0c;使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法&#xff0c;创建一个…

Linux实现简易shell

文章目录 &#x1f984;0. shell&#x1f42e;1. 交互及获取命令行&#x1f437;2. 解析命令行&#x1f42f;3. 执行命令行&#x1f405;3.1 普通命令&#x1f405;3.2 内建命令 &#x1f981;4. 主函数逻辑及演示 本章代码gitee仓库&#xff1a;简易shell &#x1f984;0. she…