I tried a binary solution to 3Sum problem in leetcodes



> Given an array `nums` of *n* integers, are there elements *a*, *b*, *c* in `nums` such that *a* + *b* + *c* = 0? Find all unique triplets in the array which gives the sum of zero.
>
> **Note:**
>
> The solution set must not contain duplicate triplets.
>
> **Example:**
>
> ```
> Given array nums = [-1, 0, 1, 2, -1, -4],
> 
> A solution set is:
> [
>   [-1, 0, 1],
>   [-1, -1, 2]
> ]
> ```

My plan: 
Divide and conquer threeSum to   
1. an iteration   
2. and a twoSum problem.  
3.  break twoSum problem to   
     1. a loop 
     2. binary search 

The complexity is : O(n*n*ln(n))



     class Solution:
        """
        Solve the problem by three module funtion
        threeSum
        two_sum
        bi_search 
        """
        def __init__(self):
            self.triplets: List[List[int]] = []
    
        def threeSum(self, nums, target=0) -> List[List[int]]:
            """
            :type nums: List[int]
            :type target: int 
            """
            nums.sort() #sort for skip duplicate and binary search 
      
            if len(nums) < 3:
                return []
    
            i = 0
            while i < len(nums) - 2:
                complement = target - nums[i]
     
                self.two_sum(nums[i+1:], complement)
                i += 1 #increment the index 
                while i < len(nums) -2 and nums[i] == nums[i-1]: #skip the duplicates, pass unique complement to next level.
                    i += 1 
      
            return self.triplets
                           
    
        def two_sum(self, nums, target):
            """
            :type nums: List[int]
            :tppe target: int
            :rtype: List[List[int]]
            """
            # nums = sorted(nums) #temporarily for testing.
            if len(nums) < 2:
                return [] 
            
            i = 0
            while i < len(nums) -1:
                complement = target - nums[i]
    
                if self.bi_search(nums[i+1:], complement) != None:
    
                    # 0 - target = threeSum's fixer 
                    self.triplets.append([0-target, nums[i], complement]) 
                i += 1
      
                while i < len(nums) and nums[i] == nums[i-1]:
                    i += 1 
          
        def bi_search(self, L, find) -> int:
            """
            :type L: List[int]
            :type find: int 
            """
            if len(L) < 1: #terninating case 
                return None 
            else:
                mid = len(L) // 2
                if find == L[mid]:
                    return find 
                
                if find > L[mid]:
                    upper_half = L[mid+1:]
                    return self.bi_search(upper_half, find)
                if find < L[mid]:
                    lower_half = L[:mid] #mid not mid-1
                    return self.bi_search(lower_half, find)


I ran it but get report 

> Status: Time Limit Exceeded

Could you please give any hints to refactor?   
Is binary search is an appropriate strategy ?