LeetCode 16. 3Sum Closest, 最接近的三数之和 ,C#

前言

本文介绍了 LeetCode 第 16 题 , “3Sum Closest”, 也就是 “最接近的三数之和” 的问题.

本文使用 C# 语言完成题目,介绍了1种方法供大家参考。

题目

English

LeetCode 16. 3Sum Closest

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

中文

LeetCode 16. 最接近的三数之和

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

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

解决方案

该题目是第15题的改版,所以整体思路跟15题一样,细节部分稍微有出入。如果读者还没有做出第15题的话,推荐先做第15题。 第15题的题解在文末的链接种给出。

在第15题题解中介绍了2种方法,其中的双指针法适合解该题。在第15题的双指针法的判定target时,是用【等于0】这个条件判断的,而该题需要找的是【最接近的】。所以我们需要1个变量来记录三数之和与target的差值,并在指针移动过程中不断的使该差值减小。

参考代码:

    public int ThreeSumClosest(int[] nums, int target)
    {
        int result = nums[0] + nums[1] + nums[2];
        int distance = Math.Abs(target - result);
        Array.Sort(nums);
        int len = nums.Length;
        for (int i = 0; i < len - 2; i++)
        {
            if (i > 0 && nums[i] == nums[i - 1]) continue; // 去重
            int left = i + 1;
            int right = len - 1;
            while (left < right)
            {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == target) return target;
                if (Math.Abs(target - sum) < distance)
                {
                    result = sum;
                    distance = Math.Abs(target - sum);
                }
                if (sum < target) left++;
                else right--;
            }
        }
        return result;
    }

执行结果

执行结果 通过。 执行用时: 104ms, 内存消耗 24.9M

复杂度分析

时间复杂度:O(n^2)

i循环占用O(n), left和right指针移动占用 O(n), 所以总计为 O(n^2).

空间复杂度:O(1)

常数数量的变量来存储值。

参考资料汇总

题目:

https://leetcode-cn.com/problems/3sum-closest/submissions/

第15题的题解:

https://leetcode-cn.com/problems/3sum/solution/leetcode-15-3sum-san-shu-zhi-he-c-by-dawufancn/

你可能感兴趣的:(LeetCode,算法,C#)