R a n k : 1264 / 1898 A C : 1 / 4 Rank:1264 / 1898 \quad AC:1/4 Rank:1264/1898AC:1/4
1413. 逐步求和得到正数的最小值
求个前缀和即可
class Solution {
public:
int minStartValue(vector<int>& nums) {
int n = nums.size();
int pre[n],minv = nums[0];
pre[0] = nums[0];
for(int i=1;i<n;i++){
pre[i]= pre[i-1]+nums[i];
minv = min(minv,pre[i]);
}
int res = 1;
for(;;res++){
if(res+minv>=1) return res;
}
return res;
}
};
1414. 和为 K 的最少斐波那契数字数目
贪心构造吧,现把表打出来,然后从后向前遍历
证明参考:和为 K 的最少斐波那契数字数目
class Solution {
public:
int findMinFibonacciNumbers(int k) {
int f[44],res = 0;
f[0] = f[1] = 1;
for(int i=2;i<44;i++){
f[i] = f[i-1]+f[i-2];
}
for(int i=43;i>=0;i--){
if(f[i]<= k){
res ++;
k -= f[i];
}
}
return res;
}
};
1415. 长度为 n 的开心字符串中字典序第 k 小的字符串
回溯写法,不过说实话我到现在也没搞清楚为啥 我注释的地方为啥就不行会报超内存…
class Solution {
public:
vector<string> res;
void dfs(string s,int n){
if(s.size()==n){
res.push_back(s);
return ;
}
else {
for(char c='a';c<='c';c++){
if(s.length()==0||c!=s.back()){
/* ******AC写法********/
dfs(s+c,n);
/* ******有问题的写法********/
// s += c;
// dfs(s,n);
/* **************/
}
}
}
}
string getHappyString(int n, int k) {
dfs("",n);
if(res.size()<k) return "";
return res[k-1];
}
};
1416. 恢复数组
主要是处理前导0,比较繁杂,思路是从右到左动态规划,dp[i]表示s[i:]能表示的方案数
d
p
[
i
]
=
d
p
[
i
]
+
d
p
[
j
+
1
]
i
<
=
j
<
n
dp[i] = dp[i] + dp[j+1] \quad i<=j<n
dp[i]=dp[i]+dp[j+1]i<=j<n
参考:处理的很难受?从右向左动规吧
class Solution {
public:
const int mod = 1e9+7;
int numberOfArrays(string s, int k) {
int n = s.length();
long long dp[n+1];
memset(dp,0,sizeof(dp));
dp[n] = 1;
for(int i=n-1;i>=0;i--){
if(s[i]=='0'){
dp[i] = 0;
// 会出现前导0
continue;
}
long long tmp = 0;
for(int j=i;j<n;j++){
tmp = tmp*10 + s[j]-'0';
if(tmp>k) break;
else {
dp[i] = (dp[i]+dp[j+1])%mod;
}
}
}
return (int)dp[0];
}
};
时间复杂度: O ( n 2 ) O(n^2) O(n2), 空间复杂度: O ( n ) O(n) O(n)