一开始用了动态规划,时间复杂度为n,结果超时了,然后看的题解,看到用的记忆化搜索。
代码其他的都好理解,就一句
min(minDays(n/2)+1+n%2,minDays(n/3)+1+n%3)
需要解释一下,首先,要变为最小天数,意味着橘子要尽可能多的除以2或者除以3,那么自然而然就想到怎么让橘子变为2的倍数或者3的倍数,变为2的倍数需要的步数为n%2,然后变为n/2又需要一步,变为3的倍数同理,然后通过递归,可以极大的提升效率,同时利用map记录出现过的数字,进一步提升速度。
class Solution {
public:
map<int,int>m;
int minDays(int n) {
if(n<=2){
return n;
}
if(m[n]){
return m[n];
}
return m[n]=min(minDays(n/2)+1+n%2,minDays(n/3)+1+n%3);
}
};