zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    workerPool _ golang
    jsp:JDBCmysql数据库连接
    jsp:session的跟踪方式
    js:使用nodejs为页面传递mysql中的数据
    js:网页中的高和宽(document)
    js:nodejs简单的Http服务器搭建
    js:面向对象编程
    js:nextSibling兄弟节点的使用
    java:mysql基础语法
    jsp:常用标签的核心标签的使用
  • 原文地址:https://www.cnblogs.com/chruny/p/4835747.html
Copyright © 2011-2022 走看看