[数组]16.3Sum Closest

16.3Sum Closest
题目大意
给定一个数组和一个target,要求找出三个数的和,且这个和最接近target。

双指针法
空间:O(n) 时间:O(n^2)
 #### 闭着眼睛也要记得的解法

(left固定 + left+right )-target = diff
如果diff变小,就更新和。
根据和与target的大小差异,移动left/right指针。

JAVA:20ms

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        // 相似15.3Sums
        Arrays.sort(nums); 
        int temp_diff = Integer.MAX_VALUE;
        int temp_closest = 0;
        
        
        for(int i = 0; i< nums.length -2 ; i++){
            int left = i+1; 
            int right = nums.length -1;
            while(left < right){
                int cur_sum = nums[left] + nums[right] + nums[i];
                int cur_diff =  Math.abs(cur_sum - target);
                //Update
                if(cur_diff < temp_diff ){
                    temp_diff = Math.abs(cur_sum - target);
                    temp_closest = cur_sum;
                }
                //Move left/right pointer
                if(cur_sum < target){
                    left++;
                }else if(cur_sum > target){
                    right--;
                }else{
                    
                    return cur_sum; //cur_sum == target
                }
            }
        }
        return temp_closest;
        
    }
}

.
.
Python : 172ms

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums.sort()
        diff = sys.maxint #记住这个用法
        for i in range(len(nums)-2):
            left = i+1
            right = len(nums)-1
            while(left < right):
                temp_sum = nums[left] + nums[right] + nums[i]
                temp_diff = temp_sum - target
                if (abs(temp_diff) < abs(diff)):
                    diff = temp_diff
                    
                #一个if语句中可以包含多个elif语句,但结尾只能有一个else语句
                if(temp_diff > 0):
                    right -= 1
                elif(temp_diff < 0):
                    left += 1
                else:
                    return temp_sum
        
        return diff + target  
        
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,936评论 0 33
  • 题目描述:给定一个有n个整数的数组S,和目标值target,在S中找三个数使其和与目标值最接近。假定每个输入只有一...
    Nautilus1阅读 110评论 0 0
  • Given an array S of n integers, find three integers in S ...
    greatseniorsde阅读 136评论 0 0
  • 思路: 类似3sum/2sum利用双指针。不同在于,这里只要计算总和就可以了,这部分更加简单。总体的思路是:先预先...
    glassyw阅读 187评论 0 0
  • 描述 Given an array S of n integers, find three integers in...
    AlexSun1995阅读 338评论 0 0

友情链接更多精彩内容