1. 程式人生 > 其它 >553. 最優除法

553. 最優除法

難度 MEDIUM
給定一組正整數,相鄰的整數之間將會進行浮點除法操作。例如, [2,3,4] -> 2 / 3 / 4 。

但是,你可以在任意位置新增任意數目的括號,來改變算數的優先順序。你需要找出怎麼新增括號,才能得到最大的結果,並且返回相應的字串格式的表示式。你的表示式不應該含有冗餘的括號。

示例:

輸入: [1000,100,10,2]
輸出: "1000/(100/10/2)"
解釋:
1000/(100/10/2) = 1000/((100/10)/2) = 200
但是,以下加粗的括號 "1000/((100/10)/2)" 是冗餘的,
因為他們並不影響操作的優先順序,所以你需要返回 "1000/(100/10/2)"。

其他用例:
1000/(100/10)/2 = 50
1000/(100/(10/2)) = 50
1000/100/10/2 = 0.5
1000/100/(10/2) = 2
說明:

輸入陣列的長度在 [1, 10] 之間。
陣列中每個元素的大小都在 [2, 1000] 之間。
每個測試用例只有一個最優除法解。

解題思路:陣列中n個數字,如果不加括號就是:

x1 / x2 / x3 / ... / xn

那麼我們如何加括號使得其值最大呢,那麼就是將x2後面的除數都變成乘數,比如只有三個數字的情況 a / b / c,如果我們在後兩個數上加上括號 a / (b / c),實際上就是a / b * c。而且b永遠只能當除數,a也永遠只能當被除數。同理,x1只能當被除數,x2只能當除數,但是x3之後的數,只要我們都將其變為乘數,那麼得到的值肯定是最大的,所以就只有一種加括號的方式,即:

x1 / (x2 / x3 / ... / xn)

這樣的話就完全不用遞迴了,這道題就變成了一個道簡單的字串操作的題目了

程式碼 t100 s85 java

class Solution {
    public String optimalDivision(int[] nums) {
        StringBuffer sb = new StringBuffer();
        int len = nums.length;
        for(int i=0; i<len; i++){
            if(i==0){
                sb.append(String.valueOf(nums[i]));
                if(len>1){                    
                    sb.append("/");
                }
                if(len>2){
                    sb.append("(");
                }
            }
            else if(i==len-1){
                sb.append(String.valueOf(nums[i]));
                if(len>2){
                    sb.append(")");
                }
            }else{
                sb.append(String.valueOf(nums[i]));
                sb.append("/");
            }
        }
        return sb.toString();
    }
}

程式碼 t100 s100 cpp

class Solution {
public:
    string optimalDivision(vector<int>& nums) {
        string res = "";
        int n = nums.size();
        for(int i=0; i<n; i++){
            if(i>0) res += "/";
            if(i==1 && n>2) res += "(";
            res += to_string(nums[i]);
            if(i==n-1 && n>2) res += ")";
        }
        return res;
    }
};

參考資料