Leetcode 第24场双周赛题解

这场题目异常简单,纯粹的手速场,附上本场比赛的排名:

5372. 逐步求和得到正数的最小值

题目链接: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;
    }
}

5373. 和为 K 的最少斐波那契数字数目

题目链接: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);
    	}
    }
}

5375. 恢复数组

题目链接: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];
    }
}
原创文章 1111 获赞 194 访问量 25万+

猜你喜欢

转载自blog.csdn.net/haut_ykc/article/details/105609955