携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
第306场周赛-力扣
第306场周赛-力扣
306的第三题,我感觉要用DFS遍历,但是尝试了很久都没写出来。事后看别人大佬的题解发现有更简便的方法。
第四题就只能是干瞪眼了,题解都看不懂,难顶啊!!!
现在介绍这个题。
6150. 根据模式串构造最小数字
给你下标从 0 开始、长度为 n 的字符串 pattern ,它包含两种字符,'I' 表示 上升 ,'D' 表示 下降 。
你需要构造一个下标从 0 开始长度为 n + 1 的字符串,且它要满足以下条件:
num 包含数字 '1' 到 '9' ,其中每个数字 至多 使用一次。
如果 pattern[i] == 'I' ,那么 num[i] < num[i + 1] 。
如果 pattern[i] == 'D' ,那么 num[i] > num[i + 1] 。
请你返回满足上述条件字典序 最小 的字符串 num。 、
示例 1
输入:pattern = "IIIDIDDD"
输出:"123549876"
解释:
下标 0 ,1 ,2 和 4 处,我们需要使 num[i] < num[i+1] 。
下标 3 ,5 ,6 和 7 处,我们需要使 num[i] > num[i+1] 。
一些可能的 num 的值为 "245639871" ,"135749862" 和 "123849765" 。
"123549876" 是满足条件最小的数字。
注意,"123414321" 不是可行解因为数字 '1' 使用次数超过 1 次。
示例 2
输入:pattern = "DDD"
输出:"4321"
解释:
一些可能的 num 的值为 "9876" ,"7321" 和 "8742" 。
"4321" 是满足条件最小的数字。
提示:
- 1 <= pattern.length <= 8
- pattern
只包含字符'I'和'D'
2.解法
class Solution {
public String smallestNumber(String pattern) {
int[] res = new int[pattern.length()+1];
for(int i = 0; i <res.length; i++) {
res[i] = i + 1;
}
int index= 0;
int start = 0;
int end = 0;
while(index<pattern.length()) {
while (index<pattern.length()&&pattern.charAt(index)=='I') {
index++;
}
start = index;
while (index<pattern.length()&&pattern.charAt(index)=='D') {
index++;
}
end = index;
reverse(res,start,end);
}
StringBuffer sb = new StringBuffer();
for(int i = 0; i < res.length; i++) {
sb.append(res[i]);
}
return sb.toString();
}
public void reverse(int[] res, int start, int end) {
while(start<end) {
int t = res[start];
res[start] = res[end];
res[end] = t;
start++;
end--;
}
}
}
解析
这个题我本以为用dfs可以做,就是每次放入一个数字,然后深度遍历,如果找到了就直接返回,没找到就去查找别的。
也可能是我基本功不行把,写不出来。
大佬的做法非常的浅显易懂。这里我拿题目给的例子进行解释一下大家就明白了。
示例1 中 pattern = "IIIDIDDD",pattern有8个字符,那就说明返回的值有9个数,分别是123456789,从第一个到第四个是递增,第四个第五个是递减,所以呢,就把第四个第五个reverse一下 变成12354,后面同理46789中,第二个是增,后面345个是减,所以把第2个到5个reverse一下变成49876,所以最后就是123549876.
示例2中 pattern="DDD"三个字符,返回值就有四个值1234,从0到4个值都是减,所以把0到4都reverse一下变成4321就可以了
再给个例子 pattern = "DDIIDID" 七个字符,返回值有8个数,12345678,0到3个数都是递减,所以把0-3reverse一下变成321,第五个到第六个是递减,所以把5和6reverse变成65,第七个和第八个是递减,所以把7和8reverse一下变成87,连起来就是32146587,就是题目要求的答案了。
第一题链接如下
杨小白_leetcode_第306场周赛-第一题2373. 矩阵中的
第二题链接如下
[杨小白]_leetcode_第306场周赛-第二题6149. 边积分最高的节点
3.结束
这个题作为三题,有自己特殊的解法,但是dfs应该也是能做出来的,还是自己太菜了,刷题刷题,每天一道,三年1000道!!!!