【数学】C039_给定数字能组成的最大时间(暴力枚举 | 局部优化)

一、题目描述

Given an array of 4 digits, return the largest 24 hour time that can be made.
 *
The smallest 24 hour time is 00:00, and the largest is 23:59. 
Starting from 00:00, a time is larger if more time has elapsed since midnight.

Return the answer as a string of length 5. 
If no valid time can be made, return an empty string.

Example 1:
Input: [1,2,3,4]
Output: "23:41"

Example 2:
Input: [5,5,5,5]
Output: ""

Note:
A.length == 4
0 <= A[i] <= 9

二、题解

(1) 暴力枚举(String.format)

/**
 * @thought:暴力枚举:
 * @date: 1/18/2020 3:12 PM
 * @Execution info:
 *  ·执行用时 9 ms 击败了 45.8 % 的java用户
 *  ·内存消耗 35MB 击败了 36.48% 的java用户
 * @Asymptotic Time Complexity:O()
 */
public String largestTimeFromDigits(int[] A) {
  int N = A.length; // A.length已知为4
  int ans = -1;
  int sumIndex=0; // 下标总和
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      if(i != j)
        for (int k = 0; k < N; k++) {
          if(k != i && k != j) {
            int l = 6-i-j-k;    // i、j、k的索引值互不相同且确定后,因为下标的总和为0+1+2+3,所以l确定。
            int h = A[i]*10 + A[j];
            int m = A[k]*10 + A[l];
            if(h < 24 && m < 60) {
              int sumM = h*60 + m;   // 统一化成分钟,比较才有意义,否则像A=[1,2,3,4],则会输出"21:43",而不是"23:41"
              if(sumM > ans)
                ans = sumM;
            }
          }
        }
    }
  }
  // "%02d":参数的值占2位,不够两位拿0填满
  return ans >= 0 ? String.format("%02d:%02d", ans/60, ans%60) : "";
}

复杂度分析

  • 时间复杂度: O ( 4 ) O(4)
  • 空间复杂度: O ( 1 ) O(1)

(2) 局部优化

/**
 * @thought:局部优化暴力枚举:
 * @date: 1/18/2020 3:20 PM
 * @Execution info:
 *  ·执行用时 1 ms 击败了 100% 的java用户
 *  ·内存消耗 34.4MB 击败了 97% 的java用户
 * @Asymptotic Time Complexity:O()
 */
public String largestTimeFromDigits2(int[] A) {
  String ansStr = "";
  int N = A.length;
  int ans = -1;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      if(i != j) {
        for (int k = 0; k < N; k++) {
          if (k != i && k != j) {
            int l = 6-i-j-k;
            int h = A[i]*10 + A[j];
            int m = A[k]*10 + A[l];
            if(h < 24 && m < 60) {
              int sumM = h*60 + m;   // 统一化成分钟比较才有意义
              if(sumM > ans) {
                ans = sumM;
                ansStr = A[i] + "" + A[j] + ":" + A[k] + A[l];
              }
            }
          }
        }
      }
    }
  }
  return ansStr;
}
发布了300 篇原创文章 · 获赞 48 · 访问量 8049

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104034141