这场题目异常简单,纯粹的手速场,附上本场比赛的排名:
题目链接:https://leetcode-cn.com/problems/minimum-value-to-get-positive-step-by-step-sum/
思路:遍历求前缀和,记录前缀和中的最小值,若最小值小于0,则答案为最小值的相反数+1,若是非负数,则答案为1.
class Solution {
public int minStartValue(int[] nums) {
int mn=Integer.MAX_VALUE;
int sum=0;
for(int i=0;i<nums.length;i++) {
sum+=nums[i];
mn=Math.min(mn, sum);
}
if(mn>=0) return 1;
return -mn+1;
}
}
题目链接:https://leetcode-cn.com/problems/find-the-minimum-number-of-fibonacci-numbers-whose-sum-is-k/
思路:k有1e9这么大,但是了解斐波那契数列的人应该知道斐波那契数列的第44项已经尝过了1e9,因此,我们可以首先预处理出前44个斐波那契项,之后通过简单的贪心思想,每次让当前的k减去小于k的斐波那契数列的最大值,我比赛中采用了二分。但其实只有44个数也没必要二分。
class Solution {
public int findMinFibonacciNumbers(int k) {
int ans=0;
long[] f=new long[51];
f[0]=f[1]=1;
for(int i=2;i<50;i++)
f[i]=f[i-1]+f[i-2];
long val=k;
while(val>0) {
int l=0,r=44;
long p=0;
while(l<=r) {
int mid=(l+r)/2;
if(f[mid]<=val) {
p=f[mid];
l=mid+1;
}
else
r=mid-1;
}
ans++;
val-=p;
}
return ans;
}
}
5374. 长度为 n 的开心字符串中字典序第 k 小的字符串
题目链接:https://leetcode-cn.com/problems/the-k-th-lexicographical-string-of-all-happy-strings-of-length-n/
思路:要构造的字符串长度只有n=10这么大,而每一位只有三种情况,因此我们可以用O(3^10)暴力构造合法字符串。
class Solution {
List<String> list;
public String getHappyString(int n, int k) {
list=new ArrayList<>();
dfs(0,n,"");
Collections.sort(list);
int num=0;
for(int i=0;i<list.size();i++) {
if(i>0 && list.get(i).equals(list.get(i-1)))
continue;
num++;
if(num==k) return list.get(i);
}
return "";
}
private void dfs(int index,int n,String s) {
if(index==n) {
list.add(s);
return;
}
for(int i=0;i<3;i++) {
char c=(char)('a'+i);
if(index>0 && s.charAt(index-1)==c)
continue;
dfs(index+1,n,s+c);
}
}
}
题目链接:https://leetcode-cn.com/problems/restore-the-array/
思路:LeetCode周赛一贯套路,最后一题十有八九就是动态规划。我们设dp[i]表示到第i位的方案数,因为每个整数最多不会超过9位数,因此当前位只和最多前九个状态有关。
class Solution {
public int numberOfArrays(String s, int k) {
int n=s.length();
long[] dp=new long[n+1];
int mod=1000000007;
dp[0]=1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=Math.min(i, 9);j++) {
if(s.charAt(i-j)=='0')
continue;
long val=Long.valueOf(s.substring(i-j, i));
if(val>=1 && val<=k)
dp[i]=(dp[i]+dp[i-j])%mod;
}
}
return (int)dp[n];
}
}