leetcode第38题

简介: 难在了题目是什么意思呢?初始值第一行是 1。第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312

image.png

难在了题目是什么意思呢?

初始值第一行是 1。

第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。

第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。

第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。

第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。

第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312211。

然后题目要求输入 1 - 30 的任意行数,输出该行是啥。

解法一 递归

可以看出来,我们只要知道了 n - 1 行,就可以写出第 n 行了,首先想到的就是递归。

第五行是 111221,求第六行的话,我们只需要知道每个字符重复的次数加上当前字符就行啦。

1 重复 3 次,就是 31,2 重复 2 次就是 22,1 重复 1 次 就是 11,所以最终结果就是 312211。

publicStringcountAndSay(intn) {
//第一行就直接输出if (n==1) {
return"1";
    }
//得到上一行的字符串Stringlast=countAndSay(n-1);
//输出当前行的字符串returngetNextString(last);
}
privateStringgetNextString(Stringlast) {
//长度为 0 就返回空字符串if (last.length() ==0) {
return"";
    }
//得到第 1 个字符重复的次数intnum=getRepeatNum(last);
// 次数 + 当前字符 + 其余的字符串的情况returnnum+""+last.charAt(0) +getNextString(last.substring(num));
}
//得到字符 string[0] 的重复个数,例如 "111221" 返回 3privateintgetRepeatNum(Stringstring) {
intcount=1;
charsame=string.charAt(0);
for (inti=1; i<string.length(); i++) {
if (same==string.charAt(i)) {
count++;
        } else {
break;
        }
    }
returncount;
}

时间复杂度:

空间复杂度:O(1)。

解法二 迭代

既然有递归,那就一定可以写出它的迭代形式。

publicStringcountAndSay(intn) {
Stringres="1";
//从第一行开始,一行一行产生while (n>1) {
Stringtemp="";
for (inti=0; i<res.length(); i++) {
intnum=getRepeatNum(res.substring(i));
temp=temp+num+""+res.charAt(i);
//跳过重复的字符i=i+num-1;
        }
n--;
//更新res=temp;
    }
returnres;
}
//得到字符 string[0] 的重复个数,例如 "111221" 返回 3privateintgetRepeatNum(Stringstring) {
intcount=1;
charsame=string.charAt(0);
for (inti=1; i<string.length(); i++) {
if (same==string.charAt(i)) {
count++;
        } else {
break;
        }
    }
returncount;
}

时间复杂度:

空间复杂度:O(1)。

递归里边又用了一个递归,我觉得这点有点意思。

相关文章
|
7月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
64 0
|
7月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
84 0
leetcode 827 最大人工岛
leetcode 827 最大人工岛
61 0
leetcode 827 最大人工岛
leetcode第55题
当自己按照 45 题的思路写完的时候,看 Solution 的时候都懵逼了,这道题竟然这么复杂?不过 Solution 把问题抽象成动态规划的思想,以及优化的过程还是非常值得学习的。
leetcode第55题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
109 0
leetcode第34题
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
105 0
leetcode第42题