leetcode第24场双周赛
逐步求和得到整数的最小值
题记:在求数组的前缀和时记录前缀和的最小值即可。
class Solution {
public:
int minStartValue(vector<int>& nums) {
int sum=0,ans=100000;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
ans=min(sum,ans);
}
if(ans>=0) ans=1;
else ans=-ans+1;
return ans;
}
};
和为k的最少斐波那契数字数目
题记:先打表前45个斐波那契数的值,然后每次减去最大的斐波那契数即可。
class Solution {
public:
int findMinFibonacciNumbers(int k) {
int f[45];
f[0]=1,f[1]=1;
for(int i=2;i<45;i++)
f[i]=f[i-1]+f[i-2];
int ans=0;
for(int j=44;j>=0;j--){
if(k>=f[j]){
k-=f[j];
ans++;
}
}
return ans;
}
};
长度为n的开心字符串中字典序第k小的字符串
题记:dfs。
class Solution {
public:
string getHappyString(int n, int k) {
vector<string> ans;
dfs(ans,"a",1,n);
dfs(ans,"b",1,n);
dfs(ans,"c",1,n);
if(ans.size()<k) return "";
return ans[k-1];
}
void dfs(vector<string>& ans,string tt,int i,int n){
if(i==n){
ans.push_back(tt);
return ;
}
if(i>0){
if(tt[i-1]=='a'){
dfs(ans,tt+'b',i+1,n);
dfs(ans,tt+'c',i+1,n);
}
else if (tt[i-1] == 'b') {
dfs(ans, tt+"a", i+1, n);
dfs(ans, tt+"c", i+1, n);
}
else if (tt[i-1] == 'c') {
dfs(ans, tt+"a", i+1, n);
dfs(ans, tt+"b", i+1, n);
}
}
}
};
恢复数组
题记:dp问题,dp[i]表示的是前i个字符能组成多少个合法数字。
typedef long long ll;
const ll mod=1e9+7;
const int N=1e5+10;
ll dp[N];
class Solution {
public:
int numberOfArrays(string s, int k) {
int n=s.length();
for(int i=0;i<=n;i++) dp[i]=0;
dp[0]=1;
for(int i=1;i<=n;i++){
ll sum=0,w=1;
for(int j=i;j>0&&j>i-10;j--){
sum=sum+w*(s[j-1]-'0');
w=w*10;
if(s[j-1]=='0') continue;
if(sum>k||sum==0) continue;
dp[i]=(dp[i]+dp[j-1])%mod;
}
cout<<dp[i]<<endl;
}
return dp[n];
}
};