Welcome to Subscribe On Youtube
949. Largest Time for Given Digits
Description
Given an array arr of 4 digits, find the latest 24-hour time that can be made using each digit exactly once.
24-hour times are formatted as "HH:MM", where HH is between 00 and 23, and MM is between 00 and 59. The earliest 24-hour time is 00:00, and the latest is 23:59.
Return the latest 24-hour time in "HH:MM" format. If no valid time can be made, return an empty string.
Example 1:
Input: arr = [1,2,3,4] Output: "23:41" Explanation: The valid 24-hour times are "12:34", "12:43", "13:24", "13:42", "14:23", "14:32", "21:34", "21:43", "23:14", and "23:41". Of these times, "23:41" is the latest.
Example 2:
Input: arr = [5,5,5,5] Output: "" Explanation: There are no valid 24-hour times as "55:55" is not valid.
Constraints:
arr.length == 40 <= arr[i] <= 9
Solutions
Solution 1: Direct Implementation
We can enumerate all the permutations of the four numbers, then determine whether each permutation meets the question requirements, and update the answer if it does.
Time complexity $O(4^3)$, space complexity $O(1)$.
Solution 2
This implementation follows the required operations directly. It traverses the relevant values and updates its state as each value is processed. After all required states have been considered, the maintained result is returned.
-
class Solution { public String largestTimeFromDigits(int[] arr) { int ans = -1; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { if (i != j && j != k && i != k) { int h = arr[i] * 10 + arr[j]; int m = arr[k] * 10 + arr[6 - i - j - k]; if (h < 24 && m < 60) { ans = Math.max(ans, h * 60 + m); } } } } } return ans < 0 ? "" : String.format("%02d:%02d", ans / 60, ans % 60); } } -
class Solution { public: string largestTimeFromDigits(vector<int>& arr) { int ans = -1; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { if (i != j && j != k && i != k) { int h = arr[i] * 10 + arr[j]; int m = arr[k] * 10 + arr[6 - i - j - k]; if (h < 24 && m < 60) { ans = max(ans, h * 60 + m); } } } } } if (ans < 0) return ""; int h = ans / 60, m = ans % 60; return to_string(h / 10) + to_string(h % 10) + ":" + to_string(m / 10) + to_string(m % 10); } }; -
class Solution: def largestTimeFromDigits(self, arr: List[int]) -> str: ans = -1 for i in range(4): for j in range(4): for k in range(4): if i != j and i != k and j != k: h = arr[i] * 10 + arr[j] m = arr[k] * 10 + arr[6 - i - j - k] if h < 24 and m < 60: ans = max(ans, h * 60 + m) return '' if ans < 0 else f'{ans // 60:02}:{ans % 60:02}' # Solution 2 class Solution: def largestTimeFromDigits(self, arr: List[int]) -> str: ans = -1 for i in range(4): for j in range(4): for k in range(4): if i != j and i != k and j != k: h = arr[i] * 10 + arr[j] m = arr[k] * 10 + arr[6 - i - j - k] if h < 24 and m < 60: ans = max(ans, h * 60 + m) return '' if ans < 0 else f'{ans // 60:02}:{ans % 60:02}' -
func largestTimeFromDigits(arr []int) string { ans := -1 for i := 0; i < 4; i++ { for j := 0; j < 4; j++ { for k := 0; k < 4; k++ { if i != j && j != k && i != k { h := arr[i]*10 + arr[j] m := arr[k]*10 + arr[6-i-j-k] if h < 24 && m < 60 { ans = max(ans, h*60+m) } } } } } if ans < 0 { return "" } return fmt.Sprintf("%02d:%02d", ans/60, ans%60) }