949. Largest Time for Given Digits

在這裏插入圖片描述

很有意思的一道題目,有幾種不同的思路。

首先我自己的思路:把每一種permutation都列舉出來(用到了之前自己不太理解的swap的方法,還挺好用的),如果符合時間要求,就轉化爲string,然後保存最大的一個:

class Solution {
public:
    string largestTimeFromDigits(vector<int>& A) {
        string maxTime = "";
        dfs(A, 0, maxTime);
        return maxTime.empty() ? maxTime : maxTime.substr(0, 2) + ":" + maxTime.substr(2, 2);
    }
private:
    stringstream ss;
    void dfs(vector<int>& A, int idx, string& maxTime) {
        if (idx == A.size()) {
            if (isValid(A)) {
                string time = nums2Str(A);
                maxTime = max(time, maxTime);
            }
        }
        for (int i = idx; i < A.size(); ++i) {//每一層,把之後的每一個數字都放到這個位置試一試
            swap(A[idx], A[i]);
            dfs(A, idx+1, maxTime);
            swap(A[idx], A[i]);
        }
    }
    
    bool isValid(vector<int>& nums) {
        if (nums[0] > 2)
            return false;
        if ((nums[0] == 2 && !(nums[1] > 3)) || (nums[0] < 2)) {
            if (nums[2] <= 5)
                return true;
        }
        return false;
    }
    
    string nums2Str(vector<int>& nums) {
        ss.str("");
        for (int num : nums)
            ss << num;
        return ss.str();
    }
};

思路很清楚,但是代碼比較繁瑣。

方法二:
評論區的代碼,真的暴力。。。

public String largestTimeFromDigits(int[] A) {
        String ans = "";
        for (int i = 0; i < 4; ++i) {
            for (int j = 0; j < 4; ++j) {
                for (int k = 0; k < 4; ++k) {
                    if (i == j || i == k || j == k) continue; // avoid duplicate among i, j & k.
                    String h = "" + A[i] + A[j], m = "" + A[k] + A[6 - i - j - k], t = h + ":" + m; // hour, minutes, & time.
                    if (h.compareTo("24") < 0 && m.compareTo("60") < 0 && ans.compareTo(t) < 0) ans = t; // hour < 24; minute < 60; update result.
                }
            }
        }
        return ans;
    }

所以說這裏也是暴力枚舉出每一種情況,只不過這裏因爲只有4個元素,所以直接使用循環來枚舉出來就行了。也記住這樣的思路吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章