Given a list of 24-hour clock time points in <strong>&quot;HH:MM&quot;</strong> format, return <em>the minimum <b>minutes</b> difference between any two time-points in the list</em>.
<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> timePoints = ["23:59","00:00"]
<strong>Output:</strong> 1
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> timePoints = ["00:00","23:59","00:00"]
<strong>Output:</strong> 0
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= timePoints.length &lt;= 2 * 10<sup>4</sup></code></li>
	<li><code>timePoints[i]</code> is in the format <strong>&quot;HH:MM&quot;</strong>.</li>
</ul>

# # My Solution. Initially Gave TLE and Only 112/114 test cases passed.
# # All test cases passed on adding the Optimization steps block
# class Solution:
#     def findMinDifference(self, timePoints: List[str]) -> int:
        
#         # Optimization Steps Start Here
#         n1 = len(timePoints)
#         timePoints = set(timePoints)
#         timePoints = list(timePoints)
#         n2 = len(timePoints)
#         if n1 > n2:
#             return 0
#         # End of Optimization Steps
        
#         minutes = []
        
#         for time in timePoints:
#             time = [int(s) for s in time.split(":")]
#             minutes.append(time[0] * 60 + time[1])
        
#         ans = inf
#         day = 24 * 60
        
#         for i in range(len(minutes)):
#             for j in range(i + 1, len(minutes)):
#                 diff_1 = abs(minutes[i] - minutes[j])
#                 diff_2 = abs((minutes[i] + day) - minutes[j])
#                 diff_3 = abs(minutes[i] - (minutes[j] + day))
#                 diff = min(diff_1, diff_2, diff_3)
#                 ans = min(ans, diff)
        
#         return ans


# # Solution 2
# class Solution:
#     def findMinDifference(self, timePoints: List[str]) -> int:
        
#         def timeToMinutes(t):
#             h, m = map(int, t.split(":"))
#             return 60*h + m
        
#         timePoints.sort()
#         res = (
#             24 * 60 - 
#             timeToMinutes(timePoints[-1]) +
#             timeToMinutes(timePoints[0])
#         )
        
#         for i in range(len(timePoints) - 1):
#             cur = timeToMinutes(timePoints[i])
#             next = timeToMinutes(timePoints[i + 1])
#             diff = next - cur
#             res = min(res, diff)
#             if res == 0:    # res cannot get lower; so return
#                 return 0
            
#         return res


# Solution 3 - Using Bucket-Sort
class Solution:
    def findMinDifference(self, timePoints: List[str]) -> int:
                     
        def timeToMinutes(t):
            h, m = map(int, t.split(":"))
            return 60*h + m
        
        exists = [False] * (60 * 24)
        
        first_m, last_m = 60 * 24, 0
        for t in timePoints:
            m = timeToMinutes(t)
            if exists[m]:
                return 0
            exists[m] = True
            first_m = min(first_m, m)
            last_m = max(last_m, m)
            
        res = (
            60 * 24 - 
            last_m +
            first_m
        )
        
        prev_m = first_m
        for m in range(first_m + 1, last_m + 1):
            if exists[m]:
                diff = m - prev_m
                res = min(res, diff)
                prev_m = m
                
        return res
19400