3Sum Closest
来源:互联网 发布:php初级项目开发案例 编辑:程序博客网 时间:2024/06/15 00:14
leetcode第16题,和3sum题类似,但是思路很不一样,要求在数组中找出三个数,使得三个数的和最接近目标数。
这道题最明显的解法是双指针法,主要思路是,先对数组排序,之后从头开始遍历,遍历过程中使用双指针,一个指向开头,一个指向结尾,三个数加和,求取和目标数的差距,如果差距为正,说明加和过大,应该向小的方向调整,所以end指针应该向左移动,同理,如果差距小于0,start指针向右移动,因为数组已经有序,这样移动肯定可以满足调整的要求。
这其中要关注这样几个问题:
- 数组为什么要排序,只有排序之后的数组,才能根据三数之和与目标数差的正负来调整前后指针哪个来移动。
- 为什么每次都是从i+1个数后面进行双指针遍历,前面的数怎么办?很明显,如果三数之和的组合出现在了i前面,那一定会被前面的大循环遍历到,因此这种遍历是没有遗漏的。
- 更小最小值时一定要判断绝对值。
- 移动指针看的是tmp这个值,而不是minNum,为什么?因为minNum记录的是最小差距,而每次移动指针是要根据每次计算和与目标数的差距来调整,也就是根据tmp调整。
- 返回的为什么不直接是三数之和?很明显,sum在这里是保留不住的,他一直在更新,因此计算得到的一定是最后一组三数之和,那不是正确答案。保留住的是最小差距minNum,所以这个数加上目标数才是返回值。
def threeSumClosest(self, nums, target): nums.sort() n = len(nums) minNum = 9999999 for i in range(n): start = i+1 end = n-1 while start < end: tmp = nums[i]+nums[start]+nums[end]-target if abs(tmp) < abs(minNum): minNum = tmp if minNum == 0: return target elif tmp < 0: start += 1 elif tmp > 0: end -= 1 return minNum+target
0 0
- 3 Sum & 3 Sum Closest
- 【Leetcode】3Sum Closest (Sum)
- LeetCode: 3 Sum Closest
- 3Sum Closest
- leetcode - 3 sum closest
- leetcode 3Sum Closest
- LeetCode: 3Sum Closest
- [Leetcode]3Sum Closest
- Leetcode: 3SUM Closest
- LeetCode 3Sum Closest
- [Leetcode] 3Sum Closest
- leetcode002:3sum closest
- LeetCode : 3Sum Closest
- LeetCode 3Sum Closest
- 3Sum Closest
- 3Sum Closest
- 3Sum Closest
- [LeetCode] 3Sum Closest
- Java类-反编译操作分析String的操作
- PHP+jQuery年会在线拍照抽奖
- web端权限维持
- Oracle用户备份/新建配置
- mysql添加外键失败原因总结
- 3Sum Closest
- 4.HDFs之java接口简单示例
- ipv6的表示方法
- hibernate4与3在配置文件中的区别
- IntelliJ IDEA过期 重新验证
- 集合是编程中最常用的数据结构
- 《JAVA与模式》之享元模式
- 3.hadoop之RPC通信简单介绍
- cocos2dx的控件