第十六题:最接近的三数之和

2024-09-06 14:12
文章标签 三数 第十六 接近

本文主要是介绍第十六题:最接近的三数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:

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

注意:

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

实现思路

先对数组进行排序,然后遍历数组中的每个元素作为三元组的第一个元素,对于每个元素使用双指针法在剩下的数组中寻找另外两个数,使得三者之和最接近目标值。为了避免重复计算,可以跳过重复的元素。

算法实现

C

#include <stdio.h>
int cmp(const void *a, const void *b) { return (*(int*)a - *(int*)b); }
int threeSumClosest(int* nums, int numsSize, int target) {qsort(nums, numsSize, sizeof(int), cmp);int closestSum = nums[0] + nums[1] + nums[2];for (int i = 0; i < numsSize - 2; ++i) {int left = i + 1, right = numsSize - 1;while (left < right) {int currentSum = nums[i] + nums[left] + nums[right];if (abs(target - currentSum) < abs(target - closestSum)) {closestSum = currentSum;}if (currentSum < target) {++left;} else if (currentSum > target) {--right;} else {return target;}}}return closestSum;
}

Python

def threeSumClosest(nums, target):nums.sort()closest_sum = sum(nums[:3])for i in range(len(nums) - 2):left, right = i + 1, len(nums) - 1while left < right:current_sum = nums[i] + nums[left] + nums[right]if abs(target - current_sum) < abs(target - closest_sum):closest_sum = current_sumif current_sum < target:left += 1elif current_sum > target:right -= 1else:return targetreturn closest_sum

Java

import java.util.Arrays;
public class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int closestSum = nums[0] + nums[1] + nums[2];for (int i = 0; i < nums.length - 2; ++i) {int left = i + 1, right = nums.length - 1;while (left < right) {int currentSum = nums[i] + nums[left] + nums[right];if (Math.abs(target - currentSum) < Math.abs(target - closestSum)) {closestSum = currentSum;}if (currentSum < target) {++left;} else if (currentSum > target) {--right;} else {return target;}}}return closestSum;}
}

时间复杂度

时间复杂度为 O(n^2),其中 n 是数组的长度。主要消耗来自于对于每个元素的双指针查找操作。空间复杂度为 O(1),不考虑输出结果的空间消耗。

这篇关于第十六题:最接近的三数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142234

相关文章

【LeetCode】最接近的三数之和

题目要求 解题思路 这道题解题方法和三数之和解题思路一样,可以参考上一篇博客 代码实现 class Solution {public:int threeSumClosest(vector<int>& nums, int target) {//排序sort(nums.begin(),nums.end());int len=nums.size();//固定一个,利用双指针解决int c

第十六篇:走入计算机网络的传输层--传输层概述

1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制,传输层需要做数据分割,所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机,无法判断数据报文应该交给哪个应用,传输层给每个应用都设置了一个编号,这个编号就是端口,目的端口可以定位报文应该发给哪个应用处理。 ③ 连接管理 面向连接的传输,需要对连接进行管理。 ④ 差错控制和流量控制

【时时三省】c语言例题----华为机试题< 查找组成一个偶数最接近的两个素数>

山不在高,有仙则名。水不在深,有龙则灵。                                                                         ----CSDN 时时三省 1,题目 HJ60 查找组成一个偶数最接近的两个素数 描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个

算法/编程练习:找出若干个数使其和最接近于M

找出若干个数使其和最接近于M 1. 题目 给定一个由正数组成的列表alts,一个目标数M需要从alts中选取若干个备选数,使其和为M若找不到和刚好与M相等的备选数列表,则返回和与M最接近的备选数列表若有多个结果,返回一个即可eg1.输入: alts = [10, 9, 8, 7, 6, 5]M = 22输出: [10, 7, 5] 或 [9, 8, 5]eg2.输入: alts =

算法----------找到 K 个最接近的元素

题目: 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。示例 1:输入: [1,2,3,4,5], k=4, x=3输出: [1,2,3,4]示例 2:输入: [1,2,3,4,5], k=4, x=-1输出: [1,2,3,4]说明:k 的值为正数,且总是小

★ 算法OJ题 ★ 力扣15 - 三数之和

Ciallo~(∠・ω< )⌒☆ ~ 今天,芝麻凛将和大家一起做一道双指针算法题--三数之和~ 目录 一  题目 二  算法解析 三  编写算法 一  题目 15. 三数之和 - 力扣(LeetCode) 二  算法解析 解法一:排序 + 暴力枚举 + 利用set去重 时间复杂度:O(N^3) 解法二:排序 + 双指针 排序;固定一个数C(C <=

2024.8.30 Python 最大连续1的个数,滑动窗口,排列组合,三数之和

1.最大连续1的个数 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 示例 1: 输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。 示例 2: 输入:nums = [0,0,1,

第十六题(树的层序遍历)

输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / \ 6 10 / \ / \ 5 7 9 11 输出8 6 10 5 7 9 11 这道题是树的层序遍历,需要用到队列数据结构,思路是从先将根节点入队(为了保证后面循环操作的一致性),然后一直重复以下操作,直到队列为空:访问队首元素并出对,将其非空的左右孩子

机器学习的入门笔记(第十六周)

本周观看了B站up主霹雳吧啦Wz的图像处理的课程, 课程链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频 下面是本周的所看的课程总结。 MobileNet V2的代码实现 1、定义ConvBNReLU类,将卷积操作,批量归一化操作,以及ReLU6激活函数封装到类中,padding的计算是保证输入和输出的图片大小不变 class ConvBNReLU(nn.Seque

找到K个最接近的元素(LeetCode)

题目 给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。 整数 a 比整数 b 更接近 x 需要满足: |a - x| < |b - x| 或者|a - x| == |b - x| 且 a < b 解题 """时间复杂度为 O(log(n-k) + k),其中 n 是数组的长度。二分查找部分