zoukankan      html  css  js  c++  java
  • leetcode刷题-16-最接近的三数之和

    问题描述

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

    示例

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

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

    实现

    双指针两侧扩展

    双指针从目标值开始,同时向两侧扩展,取最先遇到的三个数相加

    def three_sum_clostest(nums, target):
        """
        给定一个包括n个整数的数组nums和一个目标值target。
        找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。
        假定每组输入只存在唯一答案。
        """
        result_sum = 0
        pre_distance = {}
        if target<0:
            max_width = len(nums) - target
        else:
            max_width = len(nums) + target
        current_nums_num = 0
        break_flag = False
        for x in nums:
            # print(x)
            current_dis = (target - x)
    
            if current_dis < 0:
                current_dis = - current_dis
    
            if pre_distance.__contains__(x) and current_dis != 0:
                pre_distance[x] += current_dis
            elif pre_distance.__contains__(x) and current_dis == 0:
                pre_distance[x] += 1
            elif current_dis != 0:
                pre_distance[x] = current_dis
            elif current_dis == 0:
                pre_distance[x] = 1
    
        print(pre_distance)
    
        if pre_distance.__contains__(target):
            if pre_distance[target] >= 3:
                result_sum = 3 * target
                break_flag = True
            elif pre_distance[target] < 3:
                result_sum = pre_distance[target] * target
                current_nums_num = pre_distance[target]
    
        for i in range(1, max_width):
            if break_flag:
                break
            if current_nums_num == 3:
                break
            if pre_distance.__contains__((target-i)):
                distance = pre_distance[(target-i)]
                if distance == i:
                    result_sum += (target-i)
                    current_nums_num += 1
                elif (distance/i) >= (3-current_nums_num):
                    result_sum += (3-current_nums_num) * (target-i)
                    break
                elif (distance/i) < (3-current_nums_num):
                    for j in range(1, (3-current_nums_num)):
                        if current_nums_num == 3:
                            break
                        result_sum += (target-i)
                        current_nums_num += 1
    
            if pre_distance.__contains__((target+i)):
                distance = pre_distance[(target+i)]
                print(distance)
                if distance == i:
                    result_sum += (target+i)
                    current_nums_num += 1
                elif (distance/i) >= (3-current_nums_num):
                    result_sum += (3-current_nums_num) * ((target+i))
                    break
                elif (distance/i) < (3-current_nums_num):
                    for j in range(1, (3-current_nums_num)):
                        if current_nums_num == 3:
                            break
                        result_sum += (target+i)
                        current_nums_num += 1
    
        return result_sum
    
  • 相关阅读:
    [Android][Framework]裁剪SystemServer服务以及关闭SystemFeature
    [TensorFlow]Tensor维度理解
    [Objective-C]用Block实现链式编程
    [iOS]创建界面方法的讨论
    [Objective-C]编程艺术 笔记整理
    [Objective-C] Copy 和 MutableCopy
    win10的react native 开发环境搭建,使用Android模拟器
    填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)
    转载:量化投资中常用python代码分析(一)
    转载:python生成以及打开json、csv和txt文件
  • 原文地址:https://www.cnblogs.com/liuheblog/p/12296403.html
Copyright © 2011-2022 走看看