Наибольшее время для заданных цифр

Проблема

Для массива arr из 4 цифр найдите последние 24 часа, которые можно вычислить, используя каждую цифру ровно один раз.

24-часовое время форматируется как "HH:MM", где HH находится между 00 и 23, а MM находится между 00 и 59. Самое раннее 24-часовое время - 00:00, а самое позднее - 23:59.

Возвращает самое позднее 24-часовое время в "HH:MM" формате. Если невозможно указать допустимое время, верните пустую строку.

Пример 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.

Пример 2:

Input: arr = [5,5,5,5]
Output: ""
Explanation: There are no valid 24-hour times as "55:55" is not valid.

Пример 3:

Input: arr = [0,0,0,0]
Output: "00:00"

Пример 4:

Input: arr = [0,0,1,0]
Output: "10:00"

Ограничения:

`arr.length == 4`
 `0 <= arr[i] <= 9`

Давайте начнем

Наша основная цель - решить проблему и в то же время достичь наилучшей линейной временной сложности с минимальной пространственной сложностью. Если вы новичок в решении проблем или пытаетесь решить проблемы со структурой данных, я предлагаю вам начать с подхода грубой силы, а затем попытаться оптимизировать свое решение до наилучшей временной / пространственной сложности.

Анализ

Приступим к анализу постановки задачи. Учитывая массив из 4 цифр, нам нужно узнать самое позднее 24-часовое время, которое можно вычислить, используя каждую цифру «только один раз».

  • Прежде чем переходить к решению или псевдокоду, прочтите несколько раз формулировку проблемы и убедитесь, что вы хорошо ее поняли.
  • Основываясь на постановке задачи, мы понимаем, что нам нужно вычислить все возможные комбинации четырех цифр, чтобы найти ответ. Это сразу же намекнет на то, что эта проблема относится к «динамическому программированию». Это очень интересная тема - изучить все различные подходы к решению подобных проблем типа «перестановка и комбинирование».

  • Постарайтесь определить такие ключевые слова, как «каждая цифра» может использоваться «только один раз». Это наша первая подсказка. У нас есть ровно четыре цифры, чтобы составить «чч: мм» последний час (окончательный ответ).
  • Второй ключ, который мы можем придумать, - это проверить каждую цифру или удерживать вхождения цифр всех комбинаций чч: мм для сравнения с массивом, чтобы получить наш окончательный ответ.
  • Поскольку нам нужен последний час, максимальный час и минута в дне (24-часовой формат времени), нам нужно начать с максимума (23 часа и 59 минут соответственно) и выполнить итерацию назад, чтобы получить последний час.

Итак, со всеми этими подсказками и анализом, давайте начнем писать наш алгоритм или псевдокод.

Алгоритм | Псевдокод

  • Начните итерацию с максимального времени «час: минута» (23:59) и удерживайте все комбинации из 4 цифр для каждой итерации.
  • Инициализируйте логический флаг latest_hour в начале равным «истина».
  • Если 4 цифры одной итерации не совпадают с 4 элементами входного массива, мы не достигли last_hour. Поэтому установите для флага latest_hour значение false.
  • Итерируем и продолжаем, пока не найдем последний час. т.е. до тех пор, пока комбинации из 4 цифр не совпадут с 4 элементами массива.

Приступим к написанию решения.

Просмотрите каждый час и комбинацию цифр. Если мы найдем четыре точных элемента массива. Вот и все. Это наш ответ. Последние 24 часа!

Решение (на Java)

class Solution {
        public String largestTimeFromDigits(int[] arr) {
          for(int hour = 23; hour >= 0; hour--) {
                for(int minute = 59; minute >= 0; minute--) {
                    boolean latest_hour = true;
                    int[] count = new int[10];
                    count[hour < 10 ? 0 : hour / 10]++;
                    count[hour < 10 ? hour : hour % 10]++;
                    count[minute < 10 ? 0 : minute / 10]++;
                    count[minute < 10 ? minute : minute % 10]++;                
                   for(int item : arr) {
                        if(--count[item] < 0) {
                            latest_hour = false;
                            break;
                        }
                    }
                    if(latest_hour) 
                      return String.format("%02d:%02d", hour, minute);
                }
            }
            return "";
        }
    }

Сложность

Сложность времени = ›O (23 x 59 x 4) ==› O (1) Сложность пространства = ›O (1)

Заключение

Эта задача - очень хороший пример динамического программирования. Ознакомьтесь с другими примерами в этой категории для дальнейшего изучения. В динамическом программировании есть два метода: нисходящий и восходящий. Ищите будущую статью, в которой я расскажу об этих двух вещах и их различиях!

использованная литература

Проблема LeetCode в этой статье:

Https://leetcode.com/problems/largest-time-for-given-digits/

Спасибо, что прочитали этот пост!

Я надеюсь, что эта статья будет в какой-то мере информативной и полезной. Если да, поставьте лайк и поделитесь! Следуйте за мной в Twitter | LinkedIn для связанного контента.

Удачного обучения!

Первоначально опубликовано на https://geetcloud.blogspot.com 1 сентября 2021 г.