From a5a06932976ea6d0d50e300655d56d8f7bfdf7bf Mon Sep 17 00:00:00 2001 From: Atsutoshi-Honda Date: Sun, 10 May 2026 14:46:34 +0900 Subject: [PATCH] init --- 779. K-th Symbol in Grammar/memo.md | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 779. K-th Symbol in Grammar/memo.md diff --git a/779. K-th Symbol in Grammar/memo.md b/779. K-th Symbol in Grammar/memo.md new file mode 100644 index 0000000..d94bae4 --- /dev/null +++ b/779. K-th Symbol in Grammar/memo.md @@ -0,0 +1,59 @@ + +## step1: +0 +01 +0110 +01101001 +4th rowまでどう形成されるかを表してみた。4th rowの3番目の数に注視してみると、3rd rowの2番目が1だったため4th rowの3, 4番目の数が10となっている。このように、nth rowのk番目の数はn-1番目のrowの(k + 1)//2番目の数から派生する。もしn-1番目のrowの(k + 1)//2番目の数が0ならkは01のどちらかになり、0なら10のどちらかになる。もし01の場合はkが奇数の場合は0, 偶数の場合は1である。10の場合はkが奇数なら1, 偶数なら0となる。これをコードにすると以下のようになる。 +### code +```python +class Solution: + # 0 + # 01 + # 0110 + # 01101001 + def kthGrammar(self, n: int, k: int) -> int: + if n == 1: + return 0 + previous_val = self.kthGrammar(n - 1, (k + 1)//2) + if previous_val == 0: + #01 + return (k - 1)%2 + else: + #10 + return k%2 +``` +他の人のコードを見てみる。 +https://github.com/kitano-kazuki/leetcode/pull/47/changes +n行k番目のシンボルはn-1行{(k+1)//2}番目をもとに決まり、kが奇数の時はn-1行目のシンボルと一緒、kが偶数の時はn-1行目のシンボルと反対するという性質をもとにn=nからn=1までloopで辿り、n=1の0と一緒か反対かを求めて返している。これでもいいと思うが、k番目の数というのをcolで表していて個人的にこれはn×mの二次元配列に使うべきで、今回のようにnの数によって長さが変わる文字列に対してインデックスをcolと名付けると誤解を生じやすいと感じた。kでいい気がする。 + +https://github.com/hayashi-ay/leetcode/pull/46/changes +この人は最初に入力サイズを見て制約を考えていたので、自分も参考にして制約を考えてみる。1 <= n <= 30, 1 <= k <= 2^(n-1)ということで、愚直にnth rowまでの文字列を展開してk番目の文字を線形探索すると考えると、PythonのUTF-8文字列で '0' や '1' は 1 byteなので2^29byte≒1000^3/2=500MB。競プロでは250MBあたりがボーダーらしいので全ての文字を展開するのは現実的ではなさそう。線形探索も2^29≒10^9/2で、CPUが1秒に10^9回の単純演算を行うことができるのを考慮するとマックスで0.5秒で判断できる。これを考慮するとこの人がMemory Limit Exceedになったのが納得できる。 + +## step2: +### code +```python +class Solution: + def kthGrammar(self, n: int, k: int) -> int: + if n == 1: + return 0 + previous_val = self.kthGrammar(n - 1, (k + 1)//2) + if previous_val == 0: + return (k - 1)%2 + else: + return k%2 +``` + +## step3: +### code +```python +class Solution: + def kthGrammar(self, n: int, k: int) -> int: + if n == 1: + return 0 + previous_val = self.kthGrammar(n - 1, (k + 1)//2) + if previous_val == 0: + return (k - 1)%2 + else: + return k%2 +```