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;
}
};
參考資料: