题目

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).


思路

思路:三指针法

对于一个数组S,求数组中三个数a、b、c的和,使之最接近target。将问题抽象化为,求一个min使得:

\[min = arg \ min | \ target - min \ | \quad s.t. \quad min =a+b+c
\]

即求出使得$| \ target - min \ | $时min的值。

三指针法,见题[15]。三指针方法的关键是:

  • 判断三个指针的移动的方向与条件(首先对数组排序)

    • 如果min < target,说明min太小了,不够接近target,将中间指针往大的方向移动
    • 如果min = target,由于只有一个结果,故可以直接返回
    • 如果min < target,说明min太大了,超出了target,将尾指针往小的方向移动
  • 状态的更新
    • 保证min始终是指针移动过程中a+b+c的最小值。
  • 注意
    • 每次只移动一个指针

C++

int threeSumClosest(vector<int>& nums, int target) {

        sort(nums.begin(),nums.end());       //对数组排序
int min=nums[0]+nums[1]+nums[2]; //初始化最小值 for(int pBegin=0;pBegin<nums.size();pBegin++){ int pMid = pBegin+1;//中间指针
int pEnd=nums.size()-1;//尾指针 int sub=target-nums[pBegin]; while(pMid<pEnd){ if(abs(sub-nums[pMid]-nums[pEnd]) < abs(target-min)) //更新最接近target时的和
min = nums[pBegin]+nums[pMid]+nums[pEnd]; if(nums[pMid]+nums[pEnd] == sub){
return target;
}
else if(nums[pMid]+nums[pEnd] > sub){
pEnd--;
}
else{
pMid++;
}
}
}
return min;
}

Python

class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
minVal = nums[0]+nums[1]+nums[2] for pBegin in range (len(nums)):
pMid = pBegin + 1
pEnd = len(nums) - 1
subVal = target - nums[pBegin] while pMid < pEnd:
if abs(subVal - nums[pMid] - nums[pEnd]) < abs(target - minVal):
minVal = nums[pBegin] + nums[pMid] + nums[pEnd] if nums[pMid] + nums[pEnd] == subVal:
return target
elif nums[pMid] + nums[pEnd] > subVal:
pEnd -= 1
else:
pMid += 1
return minVal

最新文章

  1. hibernate_Restrictions用法
  2. Windows Server 2003搭建邮件服务器
  3. Opencv SkinOtsu皮肤检测
  4. [JS] javascript基础语法
  5. PHP(1)——学习之前做点啥准备
  6. Spring对hibernate的事物管理
  7. 【C语言学习】-03 循环结构
  8. java字符串替换函数高效实现
  9. 【剑指offer 面试题38】数字在排序数组中出现的次数
  10. Longest Run on a Snowboard
  11. RabbitMQ 原文译1.2--&quot;Hello Word&quot;
  12. jQuery常用特效插件汇总
  13. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第三章:搜索、高级过滤和视图模型
  14. [转]JS基础之undefined与null的区别
  15. 让div显示在屏幕中央的css代码段
  16. 用 fhq_Treap 实现可持久化平衡树
  17. kubernets HA集群手动部署
  18. MATLAB——BP神经网络
  19. acdream 20140730 D题
  20. 设计可以多选的按钮ChooseManyButton

热门文章

  1. html+css布局整理笔记
  2. [Offer收割]编程练习赛36
  3. GCC G++ Make CMake自我科普
  4. 深入理解DIP、IoC、DI以及IoC容器(转载)
  5. DeepMind用ReinforcementLearning玩游戏
  6. mvc关于pots请求 哪个函数 出现bug研究
  7. SQL表查询
  8. 如何添加删除子网卡eth0:1(linux案例)
  9. mongodb 和 mongoose 初探
  10. 深入理解B/S与C/S架构