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
    
  • 相关阅读:
    element-ui Checkbox 实现单选
    鼠标移到到div上,div放大
    linux下hue的安装与部署
    window10搭建pyspark(超级详细)
    Spark的checkpoint源码讲解
    Phoneix(一)简介及常用命令
    Phoneix(四)hbase导入数据同时与phoenix实现映射同步
    Phoneix(三)HBase集成Phoenix创建二级索引
    Hive数据导入Hbase
    Spark Streaming 与Filnk对比分析
  • 原文地址:https://www.cnblogs.com/liuheblog/p/12296403.html
Copyright © 2011-2022 走看看