LyWang

3_sum_closest

Nov 25th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.04 KB | None | 0 0
  1. class Solution:
  2.     """
  3.    @param numbers: Give an array numbers of n integer
  4.    @param target: An integer
  5.    @return: return the sum of the three integers, the sum closest target.
  6.    """
  7.  
  8.     def threeSumClosest(self, number, target):
  9.         # write your code here
  10.         if len(number) == 3:
  11.             return sum(number)
  12.         number.sort()
  13.         counter = 0
  14.         i = 0
  15.         while i < len(number) - 1:
  16.             if number[i] == number[i + 1]:
  17.                 if counter < 3:
  18.                     counter += 1
  19.                     i += 1
  20.                 else:
  21.                     number.pop(i)
  22.             else:
  23.                 counter = 0
  24.                 i += 1
  25.         diff = [2 ** 31, 0]
  26.         for i in range(len(number) - 2):
  27.             summation = number[i] + number[i + 1] + number[i + 2]
  28.             if summation > target:
  29.                 min_R = i  # return bigger number
  30.                 break
  31.             elif summation == target:
  32.                 return target
  33.             if i == len(number) - 3:
  34.                 return number[len(number) - 3] + number[len(number) - 2] + number[len(number) - 1]
  35.         max_L = min_R
  36.         min_R = min_R + 2
  37.         if min_R > 2:
  38.             min_R -= 1
  39.         min_in_law = number[0] + number[1]
  40.         max_in_law = number[len(number) - 2] + number[len(number) - 1]
  41.         max_R = min_R
  42.         min_L = max_L
  43.         for r in range(len(number) - 1, min_R - 1, -1):
  44.             if number[r] + min_in_law < target:
  45.                 if r < len(number) - 1:
  46.                     max_R = r + 1
  47.                 else:
  48.                     max_R = r
  49.                 break
  50.             elif number[r] + min_in_law == target:
  51.                 return target
  52.         for l in range(0, max_L + 1):
  53.             if number[l] + max_in_law > target:
  54.                 if l > 0:
  55.                     min_L = l - 1
  56.                 else:
  57.                     min_L = l
  58.                 break
  59.             elif number[l] + max_in_law == target:
  60.                 return target
  61.         for leftmost in range(min_L, max_L + 1):
  62.             tempminR = 0
  63.             tnumber = number[min_L:]
  64.             for i in range(len(number) - 1):
  65.                 summation = tnumber[i] + tnumber[i + 1] + tnumber[i + 2]
  66.                 if summation > target:
  67.                     tempminR = i + 2  # return bigger number
  68.                     break
  69.                 elif summation == target:
  70.                     return target
  71.                 if i == len(tnumber) - 3:
  72.                     tempminR = i + 2
  73.             if tempminR > 1:
  74.                 tempminR -= 1
  75.             for rightmost in range(max(min_R, leftmost + 2, tempminR + min_L), max_R + 1):
  76.                 temptarget = target - number[rightmost] - number[leftmost]
  77.                 for m in range(leftmost + 1, rightmost):
  78.                     if abs(temptarget - number[m]) < diff[0]:
  79.                         diff[0] = abs(temptarget - number[m])
  80.                         diff[1] = number[m] + number[rightmost] + number[leftmost]
  81.         return diff[1]
Add Comment
Please, Sign In to add comment