• [LeetCode]题解(python):018-4Sum


    题目来源:

    https://leetcode.com/problems/4sum/


    题意分析:

         这道题目和3Sum的题目类似,找出所有的4个数,使得这4个数等于target。


    题目思路:

        这道题做法和3Sum的一样,先排好序。固定两个数,剩下的两个数夹逼定理找出。总的时间复杂度(O(n^3))。其中可以做一些简单的优化,比如夹逼的时候,如果最小两个数之和大于target - 前两个数,或者最大的两个数之和小于target - 前两个数直接跳出。


    代码(python):

     1 class Solution(object):
     2     def fourSum(self, nums, target):
     3         """
     4         :type nums: List[int]
     5         :type target: int
     6         :rtype: List[List[int]]
     7         """
     8         size = len(nums)
     9         ans = []
    10         if size < 4:
    11             return ans
    12         nums.sort()
    13         i = 0
    14         while i < size - 3:
    15             j = i + 1
    16             while j < size - 2:
    17                 tmp = target - nums[i]- nums[j]
    18                 k = j + 1
    19                 t = size - 1
    20                 while k < t:
    21                     if nums[k] + nums[k + 1] > tmp or nums[t] + nums[t-1]< tmp:
    22                         break
    23                     if nums[k] + nums[t] < tmp:
    24                         k += 1
    25                     elif nums[k] + nums[t] > tmp:
    26                         t -= 1
    27                     else:
    28                         ans.append([nums[i],nums[j],nums[k],nums[t]])
    29                         k += 1
    30                         t -= 1
    31                         while k < t:
    32                             if nums[k] == nums[k -1]:
    33                                 k += 1
    34                             if nums[t] == nums[t+1]:
    35                                 t -= 1
    36                             if nums[k] != nums[k - 1] and nums[t] != nums[t+1]:
    37                                 break
    38                 j += 1
    39                 while j < size - 2:
    40                     if nums[j] != nums[j - 1]:
    41                         break
    42                     j += 1
    43             i += 1
    44             while i < size - 3:
    45                 if nums[i] != nums[i - 1]:
    46                     break
    47                 i += 1
    48         return ans
    View Code

    转载请注明出处:http://www.cnblogs.com/chruny/p/4835747.html

  • 相关阅读:
    ID,ClientID,UniqueID的区别
    Struct构造函数
    关于sizeof,typeof
    C#文件读写
    code1
    .NET中加密与解密QueryString的方法
    addEventListener和attachEvent的区别
    执行带参数的存储过程
    如何得到机器上装的Powershell的版本
    [Gradle] How to determine OS info
  • 原文地址:https://www.cnblogs.com/chruny/p/4835747.html
Copyright © 2020-2023  润新知