@@ -821,3 +821,78 @@ def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
821821 # otherwise it will point to first node of next level
822822 node .next = queue [0 ]
823823 return root
824+
825+
826+ ############# 658. Find K Closest Elements ############
827+ class Solution :
828+ def findClosestElements (self , arr : List [int ], k : int , x : int ) -> List [int ]:
829+ n = len (arr )
830+ left , right = 0 , n
831+ while left < right :
832+ mid = (left + right ) // 2
833+ if x <= arr [mid ]:
834+ right = mid
835+ else :
836+ left = mid + 1
837+ center = left
838+ if center == n or (arr [center ] != x and center > 0 and abs (x - arr [center - 1 ]) < abs (x - arr [center ])):
839+ center -= 1
840+ left , right = center , center # [left, right), right exclusive
841+ for i in range (k ):
842+ # print(left, right)
843+ # either decrement left or increment right
844+ if left == 0 :
845+ right += 1
846+ elif right >= n :
847+ left -= 1
848+ elif x - arr [left - 1 ] < arr [right ]- x :
849+ left -= 1
850+ elif x - arr [left - 1 ] > arr [right ]- x :
851+ right += 1
852+ else :
853+ left -= 1
854+ return arr [left :right ]
855+
856+ ############ 865. Smallest Subtree with all the Deepest Nodes ############
857+ ############# 1123. Lowest Common Ancestor of Deepest Leaves ############
858+ class Solution :
859+ def lcaDeepestLeaves (self , root : Optional [TreeNode ]) -> Optional [TreeNode ]:
860+
861+ def dfs (node ):
862+ if not node :
863+ return None , 0
864+ leftfound , leftlevel = dfs (node .left )
865+ rightfound , rightlevel = dfs (node .right )
866+
867+ if leftlevel > rightlevel :
868+ return leftfound , leftlevel + 1
869+ if leftlevel < rightlevel :
870+ return rightfound , rightlevel + 1
871+
872+ return node , leftlevel + 1
873+
874+ return dfs (root )[0 ]
875+
876+
877+ ############# 16. 3Sum Closest ############
878+ class Solution :
879+ def threeSumClosest (self , nums : List [int ], target : int ) -> int :
880+ res = float ('inf' )
881+ diff = float ('inf' )
882+ nums .sort ()
883+ n = len (nums )
884+ for i in range (n - 2 ):
885+ j , k = i + 1 , n - 1
886+ while j < k :
887+ s = nums [i ] + nums [j ] + nums [k ]
888+ d = s - target
889+ if abs (d ) < diff :
890+ res = s
891+ diff = abs (d )
892+ if d > 0 :
893+ k -= 1
894+ elif d < 0 :
895+ j += 1
896+ else :
897+ return target
898+ return res
0 commit comments