diff --git a/.markdownlint.json b/.markdownlint.json index d3f5138f..8b73cc44 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -56,6 +56,8 @@ "MD042": false, "MD046": { "style": "fenced" }, "MD048": { "style": "backtick" }, + "MD049": false, + "MD050": false, "MD058": false, "MD060": false } diff --git a/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Python.md b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Python.md new file mode 100644 index 00000000..b7bb8300 --- /dev/null +++ b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Python.md @@ -0,0 +1,370 @@ +> ð¯ **[algo-beginner ã¹ãã«çºç«]** +> èšèª/ã«ããŽãª: Python +> é©çšã«ãŒã«ã»ãã: å ±é5ã«ãŒã« + Pyåºæ4ã«ãŒã« +> åç §ãã¡ã€ã«: references/common.md + references/python.md + +--- + +# Pascal's TriangleïŒãã¹ã«ã«ã®äžè§åœ¢ïŒâ Pythonç + +--- + +## 1. åé¡åæçµæ + +> ð¡ **ååŠè åãè£è¶³** +> ãã®åé¡ã¯äžèšã§èšããšã**ãäžè§åœ¢ã®åœ¢ã«äžŠãã æ°å€ã®è¡šããäžããé çªã«1è¡ãã€ç©ã¿äžããŠäœãåé¡ã** ã§ãã + +ãŸãç®ã§ç¢ºèªããŸãããã + +``` +è¡0ïŒ [1] +è¡1ïŒ [1, 1] +è¡2ïŒ [1, 2, 1] +è¡3ïŒ[1, 3, 3, 1] +è¡4ïŒ[1, 4, 6, 4, 1] +``` + +ã«ãŒã«ã¯2ã€ã ãã§ãïŒ + +- åè¡ã® **䞡端ã¯å¿ ã `1`** +- å åŽã®èŠçŽ ã¯ **çäžã®å·Šãšå³ã®æ°å€ãè¶³ããå€**ïŒäŸïŒè¡2ã® `2` = è¡1ã® `1 + 1`ïŒ + +**Pythonã§è§£ãéã®CPythonç¹æã®æ³šæç¹**ïŒãã®åé¡ã¯æ°ãããªã¹ããè¡ããšã«çæããŠããåŠçã®ãããã¡ã¢ãªã¢ãã±ãŒã·ã§ã³ïŒïŒã¡ã¢ãªãæ°ãã«ç¢ºä¿ããããšïŒãé »ç¹ã«çºçããŸãã`numRows †30` ãšããå¶çŽã®ããçŸå®çã«ã¯åé¡ã«ãªããŸãããããªã¹ãå å 衚èšïŒ`[1] + [...] + [1]` ã®ãããªæžãæ¹ïŒã¯CPythonã®ãã€ãã³ãŒãã¬ãã«ã§æé©åãããŠãããçŽ æŽãª `for` ã«ãŒãããé«éã«åäœããŸãã + +--- + +### ç«¶æããã°ã©ãã³ã°èŠç¹ + +- **å¶çŽåæ**ïŒ`numRows †30` â æå€§ã§ã `30Ã31/2 = 465èŠçŽ ` ããçæããŸãããO(n²) ã§ååéã«åããŸã +- **æéææ³**ïŒåè¡ããªã¹ãå å 衚èšã§äžæ¬çæãããCå®è£ ïŒïŒCèšèªã§æžãããé«éãªåŠçïŒã®æ©æµãåãããã +- **ã¡ã¢ãªæå°å**ïŒçŽåã®1è¡ã ãåç §ããã°æ¬¡ã®è¡ãäœãããããå šè¡ãä¿æããªããçµæãæ§ç¯ããŸã + +### æ¥åéçºèŠç¹ + +- **åå®å šèšèš**ïŒ`list[list[int]]` ãæ»ãå€åãšããŠæç€ºã`numRows: int` ã®å ¥åæ€èšŒã§ç¯å²å€ãæ©æã«åŒŸã +- **ãšã©ãŒãã³ããªã³ã°**ïŒå¶çŽ `1 †numRows †30` ã®ç¯å²å€ããŸã㯠`int` 以å€ã®åãæž¡ããããšãã«åããããããšã©ãŒãæãã +- **å¯èªæ§**ïŒååŠçã `_build_row()` ãã«ããŒã«åé¢ããã¡ã€ã³ããžãã¯ãçãä¿ã€ + +### Pythonç¹æåæ + +- **ããŒã¿æ§é éžæ**ïŒè¡ã¯ `list[int]` ãæé©ã䞡端æäœã¯ãªããã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ãé »ç¹ãªãã `deque`ïŒïŒååŸããåºãå ¥ãã§ãã䞡端ãã¥ãŒïŒããã `list` ãåããŠããŸã +- **æšæºã©ã€ãã©ãªæŽ»çšåºŠ**ïŒä»å㯠`itertools` ã `collections` ã¯äžèŠã`list` ãšå å 衚èšã ãã§å®çµããŸã +- **CPythonæé©å床**ïŒãªã¹ãå å 衚èšã§Cå®è£ ã¬ãã«ã®é«éåãæŽ»ãããŸã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **CPython**ïŒæãåºã䜿ãããPythonã®å®è£ ãCèšèªã§æžãããŠãããçµã¿èŸŒã¿é¢æ°ã®å€ããCå®è£ ã®ããé«é +> - **ãªã¹ãå å 衚èš**ïŒ`[åŒ for 倿° in ã€ãã©ãã«]` ãšãã圢ã§ãªã¹ãã1è¡ã§äœãæžãæ¹ã`for` ã«ãŒãããé«éãªçç±ã¯ãCPythonãå å 衚èšå°çšã®æé©åããããã€ãã³ãŒãåœä»€ïŒ`LIST_APPEND`ïŒã䜿ããã +> - **å¶çŽåæ**ïŒåé¡ã®å ¥åãµã€ãºäžéãããã©ã®ãããã®èšç®éãŸã§èš±å®¹ããããããéç®ããããš +> - **ã¡ã¢ãªã¢ãã±ãŒã·ã§ã³**ïŒããã°ã©ã ãæ°ããããŒã¿ãæ ŒçŽããããã«ã¡ã¢ãªé åã確ä¿ããããš + +--- + +## 2. æ¡çšã¢ã«ãŽãªãºã ãšæ ¹æ + +> ð¡ **ååŠè åãè£è¶³** +> åãåé¡ã§ãè§£ãæ¹ã¯è€æ°ãããŸããããããã®ãéãïŒæéèšç®éïŒããšãã¡ã¢ãªã®äœ¿ããããïŒç©ºéèšç®éïŒããæ¯ã¹ãŠæé©ãªãã®ãéžã³ãŸãã + +| ã¢ãããŒã | æéèšç®é | 空éèšç®é | Pythonå®è£ ã³ã¹ã | å¯èªæ§ | æšæºã©ã€ãã©ãªæŽ»çš | CPythonæé©å | åè | +| ----------------------------- | ---------- | ---------- | ---------------- | ------ | ------------------ | -------------- | ---------------------------------------------------------------------- | +| **A. 鿬¡è¡æ§ç¯ïŒä»åéžæïŒ** | O(n²) | O(n²) | äœ | â â â | list ã®ã¿ | é©ïŒå å 衚èšïŒ | çŽæçã§æãã·ã³ãã« | +| B. äºé ä¿æ°ã§çŽæ¥èšç® | O(n²) | O(n²) | äž | â â â | math.comb | é© | 倧ããªæŽæ°ã§ç²ŸåºŠã¯åé¡ãªãïŒPythonã¯å€å鷿޿°ïŒããã ãå®è£ ãããé£è§£ | +| C. ååž°ïŒã¡ã¢åãªãïŒ | ææªã§ææ°çïŒååž°å®çŸ©ã§å€å | O(n²) | é« | â ââ | ãªã | äžé© | åãå€ãäœåºŠãåèšç®ã`@lru_cache` 远å ã§æ¹åã§ãããéå° | + +**éžæçç±**ïŒ**æ¹æ³AïŒéæ¬¡è¡æ§ç¯ïŒ** ãéžã³ãŸãã + +- **æ¹æ³Bãéžã°ãªãã£ãçç±**ïŒ`math.comb(n, k)` ã§èšç®ã¯å¯èœã§ããããåè¡ã䜿ã£ãŠæ¬¡è¡ãäœãããšãããã¹ã«ã«ã®äžè§åœ¢ã®æ¬è³ªçãªã«ãŒã«ãçŽæ¥ã³ãŒãã§è¡šçŸã§ããæ¹æ³Aã®æ¹ãå¯èªæ§ã»ä¿å®æ§ã«åªããŠããŸã +- **æ¹æ³Cãéžã°ãªãã£ãçç±**ïŒååž°ã¯åŒã³åºãã¹ã¿ãã¯ïŒïŒé¢æ°åŒã³åºããèšé²ããé åïŒãæ¶è²»ããèšç®éãéå¹çïŒååž°å®çŸ©ã«äŸåããææ°çã«ãªãããšãããïŒã§ããã®åé¡ã«ã¯é©ããŸãã +- **Pythonæé©åæŠç¥**ïŒåè¡ã®å åŽããªã¹ãå å 衚èšã§äžæ¬çæããããšã§ãCPythonã®å å è¡šèšæé©åã®æ©æµãåããŸã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **æéèšç®é**ïŒå ¥åã®å€§ããã«å¯ŸããŠåŠçã«ãããæéãã©ãå¢ãããã®ç®å® +> - **空éèšç®é**ïŒåŠçäžã«äœ¿ãã¡ã¢ãªéãã©ãå¢ãããã®ç®å® +> - **`math.comb(n, k)`**ïŒçµã¿åããã®æ° C(n,k) ãèšç®ããPython 3.8+ ã®æšæºé¢æ°ãPythonã¯å€å鷿޿°ïŒïŒæ¡æ°ã®å¶éããªãæŽæ°ïŒãæ±ãããã粟床ã®åé¡ã¯ãªã +> - **åŒã³åºãã¹ã¿ãã¯**ïŒé¢æ°ã颿°ãåŒã³åºããšããã©ãããåŒã°ããããèšé²ããã¡ã¢ãªé åãæ·±ãååž°ã¯ããã䜿ãå°œãã㊠`RecursionError` ãèµ·ãã + +--- + +## 3. å®è£ ãã¿ãŒã³ + +> ð¡ **ã³ãŒãã®å€§ãŸããªæ§é ïŒéªšæ ŒïŒ** +> +> 1. å ¥å `numRows` ã®åã»ç¯å²ãæ€èšŒãã +> 2. çµææ ŒçŽçšã®2次å ãªã¹ããçšæãã +> 3. 1è¡ç®ïŒ`[1]`ïŒãç¡æ¡ä»¶ã§è¿œå ãã +> 4. 2è¡ç®ä»¥éïŒå é ãšæ«å°Ÿã `1` ã«åºå®ããå åŽããªã¹ãå å 衚èšã§èšç®ãã +> 5. 宿ããäžè§åœ¢ãè¿ã + +--- + +### æ¥åéçºç + +``` +ãæ¥åéçºçã䜿ãå Žé¢ã +ããŒã ã§é·æéã¡ã³ããã³ã¹ãããããã¯ã·ã§ã³ã³ãŒãã«åããŸãã +åãã³ããšdocstringã«ãããåŸããèªã人ãåŠçã®æå³ãçè§£ããããã +pylanceã«ããéçåãã§ãã¯ã§ãã°ãå®è¡åã«çºèŠã§ããŸãã +``` + +```python +# Runtime 0 ms +# Beats 100.00% +# Memory 19.35 MB +# Beats 28.62% +from typing import Any + + +class Solution: + """ + ãã¹ã«ã«ã®äžè§åœ¢çæã¯ã©ã¹ïŒæ¥åéçºçïŒ + + åè¡ã¯åã®è¡ã ããåç §ã㊠O(n) ã§æ§ç¯ããã + å šäœã®æéèšç®é㯠O(n²)ã空éèšç®é㯠O(n²)ã + """ + + def generate(self, numRows: int) -> list[list[int]]: + """ + ãã¹ã«ã«ã®äžè§åœ¢ã®æåã® numRows è¡ãçæããŠè¿ãã + + Args: + numRows: çæããè¡æ°ãå¶çŽ: 1 †numRows †30 + + Returns: + åè¡ã list[int] ã§è¡šãã 2 次å ãªã¹ã + + Raises: + TypeError: numRows ã int åã§ãªãå Žå + ValueError: numRows ãå¶çŽç¯å²å€ïŒ1ã30以å€ïŒã®å Žå + + Time Complexity: O(n²) n = numRows + Space Complexity: O(n²) + """ + # âââ å ¥åæ€èšŒ âââââââââââââââââââââââââââââââââââââââââââââ + # isinstance() ã§åãã§ãã¯ããã + # Python ã¯åçåä»ãèšèªã®ãããåŒã³åºãå ã誀ã£ãåãæž¡ããŠã + # å®è¡æãŸã§æ°ã¥ããªããããã§åŒŸãããšã§åããããããšã©ãŒã«ããã + # bool 㯠int ã®ãµãã¯ã©ã¹ãªã®ã§ isinstance(True, int) â True ã«ãªãã + # ãããé²ãããã« bool ãã§ãã¯ãå ã«è¡ãã + if isinstance(numRows, bool) or not isinstance(numRows, int): + raise TypeError( + f"numRows must be an int, got: {type(numRows).__name__}" + ) + + # å¶çŽã1 †numRows †30ãã®ç¯å²å€ã匟ãã + # åŸç¶ã®åŠçã§ãªã¹ãã®ç¯å²å€ã¢ã¯ã»ã¹ãèµ·ããã®ãé²ãããã + if numRows < 1 or numRows > 30: + raise ValueError( + f"numRows must be between 1 and 30, got: {numRows}" + ) + + # âââ çµæé åã®æºå âââââââââââââââââââââââââââââââââââââââ + # list[list[int]] = ãæŽæ°ã®ãªã¹ãããèŠçŽ ãšãã2次å ãªã¹ã + triangle: list[list[int]] = [] + + # âââ è¡ã1è¡ãã€ç©ã¿äžãã ââââââââââââââââââââââââââââââââ + for row_index in range(numRows): + # åè¡ã®å åŽã®èŠçŽ ã ããèšç®ãã䞡端ã¯åŸã§ [1] + [...] + [1] ã§è¿œå ãã + current_row = self._build_row(triangle, row_index) + triangle.append(current_row) + + return triangle + + def _build_row( + self, triangle: list[list[int]], row_index: int + ) -> list[int]: + """ + æå®ããè¡ã€ã³ããã¯ã¹ã®è¡ãæ§ç¯ããŠè¿ããã«ããŒé¢æ°ã + + Args: + triangle: ãããŸã§ã«æ§ç¯ããäžè§åœ¢ïŒåè¡ãåç §ããããã«äœ¿ãïŒ + row_index: ä»ããæ§ç¯ããè¡ã®ã€ã³ããã¯ã¹ïŒ0å§ãŸãïŒ + + Returns: + æ°ããæ§ç¯ããè¡ïŒlist[int]ïŒ + """ + # 0è¡ç®ïŒèŠçŽ ã¯ [1] ã ããåã®è¡ãååšããªãã®ã§ãã®ãŸãŸè¿ãã + if row_index == 0: + return [1] + + # 1è¡ç®ïŒ[1, 1]ãå åŽã®èŠçŽ ããªãã®ã§ãã®ãŸãŸè¿ãã + if row_index == 1: + return [1, 1] + + # 2è¡ç®ä»¥éïŒåã®è¡ãåç §ããŠå åŽãèšç®ããã + # prev ã¯åã®è¡ãžã®åç §ãå㯠list[int] ãšããã£ãŠããããåå®å šã + prev: list[int] = triangle[row_index - 1] + + # ãªã¹ãå å 衚èšïŒïŒãªã¹ãã1è¡ã§äœãæžãæ¹ïŒã§å åŽã®èŠçŽ ãäžæ¬èšç®ããã + # ãªããªã¹ãå å 衚èšã䜿ããïŒCPythonããã€ãã³ãŒãã¬ãã«ã§ + # ã«ãŒãå°çšã®æé©ååœä»€ïŒLIST_APPENDïŒã䜿ãããã + # çŽ æŽãª for ã«ãŒããããé«éã«åäœããããã + # prev[col - 1] + prev[col] ïŒ çäžã®å·Š + çäžã®å³ + inner: list[int] = [ + prev[col - 1] + prev[col] + for col in range(1, row_index) # å é ãšæ«å°Ÿã¯ã¹ãããïŒäž¡ç«¯ã¯å¿ ã 1ïŒ + ] + + # å é ã® [1] + å åŽ + æ«å°Ÿã® [1] ãçµåããŠå®æããè¡ã«ãã + return [1] + inner + [1] +``` + +--- + +### ç«¶æããã°ã©ãã³ã°ç + +``` +ãç«¶æããã°ã©ãã³ã°çã䜿ãå Žé¢ã +LeetCodeã®å¶éæéå ã«æ£è§£ãåºãããšãç®çã®ã³ãŒãã«åããŸãã +åãã§ãã¯ããšã©ãŒãã³ããªã³ã°ãçç¥ããã³ãŒããæçã»æéã«ããŠããŸãã +å¯èªæ§ãããå®è¡é床ãšã³ãŒãã®çããæåªå ã«ããæžãæ¹ã§ãã +``` + +```python +class Solution: + def generate(self, numRows: int) -> list[list[int]]: + # çµæãæ ŒçŽãããªã¹ãããŸã1è¡ç®ãçŽæ¥å ¥ãã + tri: list[list[int]] = [[1]] + + # 2è¡ç®ä»¥éãã«ãŒãã§ç©ã¿äžããïŒrange(1, numRows) ã§0è¡ç®ãã¹ãããïŒ + for i in range(1, numRows): + # çŽåã®è¡ãåãåºãïŒã€ã³ããã¯ã¹ -1 ã¯æ«å°Ÿ = çŽåã®è¡ïŒ + p = tri[-1] + + # 䞡端㮠[1] ãšå åŽãå å 衚èšã§äžæ¬çæããŠ1è¡ã§å®æãããã + # p[j-1] + p[j] ïŒ çäžã®å·Š + çäžã®å³ + tri.append([1] + [p[j - 1] + p[j] for j in range(1, i)] + [1]) + + return tri +``` + +--- + +### ð¡ ã³ãŒãã®åäœãã¬ãŒã¹ïŒ`numRows = 5` ã®å ŽåïŒ + +æ¥åéçºçã®æµããå ·äœçã«è¿œããŸãã + +``` +å ¥å: numRows = 5 + +âââ å ¥åæ€èšŒ âââ +isinstance(5, bool) â FalseïŒboolãã§ãã¯ééïŒ +isinstance(5, int) â TrueïŒåãã§ãã¯ééïŒ +1 <= 5 <= 30 â æ€èšŒéé â + +âââ ã«ãŒãéå§ âââ + +[row_index = 0] + _build_row() â row_index == 0 ãªã®ã§ [1] ãå³è¿ã + triangle = [[1]] + +[row_index = 1] + _build_row() â row_index == 1 ãªã®ã§ [1, 1] ãå³è¿ã + triangle = [[1], [1, 1]] + +[row_index = 2] + prev = [1, 1] + inner = [prev[0] + prev[1]] = [1 + 1] = [2] â col=1 ã®1ã¹ãããã ã + current_row = [1] + [2] + [1] = [1, 2, 1] + triangle = [[1], [1,1], [1,2,1]] + +[row_index = 3] + prev = [1, 2, 1] + inner: + col=1 â prev[0] + prev[1] = 1 + 2 = 3 + col=2 â prev[1] + prev[2] = 2 + 1 = 3 + inner = [3, 3] + current_row = [1] + [3, 3] + [1] = [1, 3, 3, 1] + triangle = [[1],[1,1],[1,2,1],[1,3,3,1]] + +[row_index = 4] + prev = [1, 3, 3, 1] + inner: + col=1 â prev[0] + prev[1] = 1 + 3 = 4 + col=2 â prev[1] + prev[2] = 3 + 3 = 6 + col=3 â prev[2] + prev[3] = 3 + 1 = 4 + inner = [4, 6, 4] + current_row = [1] + [4, 6, 4] + [1] = [1, 4, 6, 4, 1] + triangle = [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] + +âââ 宿 âââ +åºå: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] â +``` + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ãªã¹ãå å 衚èš**ïŒ`[åŒ for 倿° in ã€ãã©ãã«]` ãšãã圢ã§ãªã¹ãã1è¡ã§äœãæžãæ¹ãCPythonã¯å å 衚èšå°çšã®æé©åããããã€ãã³ãŒãåœä»€ïŒ`LIST_APPEND`ïŒã䜿ããããåãåŠçã `for` ã«ãŒãã§æžãããé«é +> - **`isinstance()`**ïŒå€æ°ãããåãã©ããã調ã¹ãçµã¿èŸŒã¿é¢æ°ãCèšèªå®è£ ã®ããé«éã`type(x) == int` ãšã¯ç°ãªãããµãã¯ã©ã¹ãå«ããŠãã§ãã¯ãã +> - **`bool` 㯠`int` ã®ãµãã¯ã©ã¹**ïŒPythonã§ã¯ `True` ã¯å éšçã« `1`ã`False` 㯠`0` ãšããŠæ±ãããããã®ãã `isinstance(True, int)` ã `True` ãè¿ããŠããŸããæå³ããªãå€ãééããããã°ã«ãªãããããå ã« `isinstance(x, bool)` ããã§ãã¯ããé çªãéèŠ +> - **åãã³ã**ïŒé¢æ°ã®åŒæ°ãæ»ãå€ã«åãæ³šéãšããŠæžãä»çµã¿ã`def f(x: int) -> list[int]:` ã®ããã«æžããPythonã¯åçåä»ããªã®ã§åãæžããªããŠãåãããpylanceã«ããéçåãã§ãã¯ã掻çšããããã«æžã +> - **`tri[-1]`**ïŒãªã¹ãã®æ«å°ŸèŠçŽ ãžã®ã¢ã¯ã»ã¹ãPythonåºæã®è² ã®ã€ã³ããã¯ã¹èšæ³ã`tri[len(tri)-1]` ãšåãæå³ã ãçãæžãã + +--- + +## 4. æ€èšŒïŒãšããžã±ãŒã¹ç¢ºèªïŒ + +ãšããžã±ãŒã¹ã®ãã¹ãã¯ãã¢ã«ãŽãªãºã ãããµã€ãã®å ¥åãã ãã§ãªããæ¥µç«¯ãªå ¥åãã§ãæ£ããåããã確ãããããã®ãã®ã§ãã + +```python +# âââ å¢çå€ãã¹ãïŒæ¥åéçºçïŒ âââ + +sol = Solution() + +# æå°å€ïŒnumRows = 1 +# æåŸ å€: [[1]] +assert sol.generate(1) == [[1]] + +# æå€§å€ïŒnumRows = 30 +# æåŸ å€ã®æåŸã®è¡ã C(29,0)...C(29,29) ã«ãªã£ãŠããããšãç¢ºèª +result_30 = sol.generate(30) +assert len(result_30) == 30 # 30è¡ããããš +assert result_30[0] == [1] # å é è¡ã [1] ã§ããããš +assert result_30[-1][0] == 1 # æçµè¡ã®å é ã 1 ã§ããããš +assert result_30[-1][-1] == 1 # æçµè¡ã®æ«å°Ÿã 1 ã§ããããš +assert result_30[4] == [1,4,6,4,1] # 5è¡ç®ã®å€ãæ£ããããš + +# Example 1: numRows = 5 +assert sol.generate(5) == [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] + +# Example 2: numRows = 1 +assert sol.generate(1) == [[1]] + +# âââ åã»ç¯å²ãšã©ãŒã®ãã¹ãïŒæ¥åéçºçã®ã¿ïŒ âââ + +import traceback + +# int ã§ãªãåãæž¡ã â TypeError ãçºçãããç¢ºèª +try: + sol.generate("5") # type: ignore[arg-type] + assert False, "TypeError ãçºçããã¹ã" +except TypeError: + pass # æåŸ éã â + +# bool ãæž¡ã â TypeError ãçºçããã確èªïŒbool 㯠int ã®ãµãã¯ã©ã¹ãªã®ã§æ³šæïŒ +try: + sol.generate(True) # type: ignore[arg-type] + assert False, "TypeError ãçºçããã¹ã" +except TypeError: + pass # æåŸ éã â + +# ç¯å²å€ïŒ0以äžïŒâ ValueError ãçºçãããç¢ºèª +try: + sol.generate(0) + assert False, "ValueError ãçºçããã¹ã" +except ValueError: + pass # æåŸ éã â + +# ç¯å²å€ïŒ31以äžïŒâ ValueError ãçºçãããç¢ºèª +try: + sol.generate(31) + assert False, "ValueError ãçºçããã¹ã" +except ValueError: + pass # æåŸ éã â +``` + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ãšããžã±ãŒã¹**ïŒç©ºã®ãªã¹ãã»æå°å€ã»æå€§å€ãªã©ãå¢ççãªæ¡ä»¶ã®ããšãéåžžã®å ¥åã§ã¯åããŠããå¢çã§ã¯å£ããã¢ã«ãŽãªãºã ã¯å€ã +> - **å¢çå€ãã¹ã**ïŒãšããžã±ãŒã¹ã«å¯ŸããŠãã¢ã«ãŽãªãºã ãæ£ããåããã確ãããããš +> - **éçåãã§ãã¯**ïŒpylanceãã³ãŒããå®è¡ããèªãã ãã§ãã°ãåãšã©ãŒãæ€åºããææ³ã`# type: ignore` ã³ã¡ã³ãã§æå³çã«åãã§ãã¯ãç¡å¹åããããšãã§ãã +> - **`assert`æ**ïŒæ¡ä»¶ã `False` ã®ãšã `AssertionError` ãçºçãããæ§æããã¹ãã³ãŒãã§ããã®å€ã§ããã¯ããã衚çŸãããšãã«ãã䜿ã diff --git a/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Typescript.md b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Typescript.md new file mode 100644 index 00000000..ba7ab4e8 --- /dev/null +++ b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/Pascal's_Triangle_Typescript.md @@ -0,0 +1,268 @@ +> ð¯ **[algo-beginner ã¹ãã«çºç«]** +> èšèª/ã«ããŽãª: TypeScript +> é©çšã«ãŒã«ã»ãã: å ±é5ã«ãŒã« + TSåºæ5ã«ãŒã« +> åç §ãã¡ã€ã«: references/common.md + references/typescript.md + +--- + +# Pascal's TriangleïŒãã¹ã«ã«ã®äžè§åœ¢ïŒ + +--- + +## 1. åé¡ã®åæ + +> ð¡ **ååŠè åãè£è¶³** +> ãã®åé¡ã¯äžèšã§èšããšã**ãäžè§åœ¢ã®åœ¢ã«äžŠãã æ°å€ã®è¡šããäžããé çªã«è¡ãç©ã¿äžããŠäœãåé¡ã** ã§ãã + +ãã¹ã«ã«ã®äžè§åœ¢ãšã¯äœããå ã«ç®ã§ç¢ºèªããŸãããã + +``` +è¡0ïŒ [1] +è¡1ïŒ [1, 1] +è¡2ïŒ [1, 2, 1] +è¡3ïŒ [1, 3, 3, 1] +è¡4ïŒ [1, 4, 6, 4, 1] +``` + +**ã«ãŒã«**ã¯ãã£ã2ã€ã§ãïŒ + +- åè¡ã® **䞡端ã¯å¿ ã `1`** +- å åŽã®èŠçŽ ã¯ **çäžã®å·Šãšå³ã®èŠçŽ ãè¶³ããå€**ïŒäŸïŒè¡2ã® `2` = è¡1ã® `1 + 1`ïŒ + +--- + +### ç«¶æããã°ã©ãã³ã°èŠç¹ã§ã®åæ + +- åè¡ãåã®è¡ãã `O(k)`ïŒkã¯ãã®è¡ã®èŠçŽ æ°ïŒã§æ§ç¯ã§ããŸã +- å šäœã®èŠçŽ æ°ã¯ `1 + 2 + 3 + ... + numRows = numRows*(numRows+1)/2` ãªã®ã§ã**æäœã§ã O(numRows²) ã®æéã»ç©ºé**ãå¿ èŠ +- `numRows †30` ãšããå¶çŽïŒïŒå ¥åãæå€§30ãšããäžéïŒããããããææªã§ã `30*31/2 = 465èŠçŽ ` ããçæããŸãããèšç®éãç¹å¥ã«æå°åããªããŠãååé«éã§ã + +### æ¥åéçºèŠç¹ã§ã®åæ + +- **åå®å šæ§**ïŒæ»ãå€ `number[][]`ïŒæ°å€ã®2次å é åïŒãæç€ºããåè¡ã `number[]` ã§ããããšãã³ã³ãã€ã«æã«ä¿èšŒããŸã +- **ãšã©ãŒãã³ããªã³ã°**ïŒå¶çŽ `1 †numRows †30` ã®ç¯å²å€å ¥åãå®è¡æã«æ€åºããŠåŒŸããŸã +- **ã€ãã¥ãŒã¿ãã«å¿å**ïŒïŒããŒã¿ãçŽæ¥æžãæãããæ°ããããŒã¿ãšããŠäœãèãæ¹ïŒïŒåè¡ãæ°ããé åãšããŠæ§ç¯ããåã®è¡ãå£ããŸãã + +### TypeScriptç¹æã®èæ ®ç¹ + +- **åæšè«**ïŒïŒåãæžããªããŠãTypeScriptãèªå倿ããæ©èœïŒïŒ`prev.length` ãªã©ãã `number` åãèªåæšè«ãããŸã +- `readonly number[]`ïŒïŒèªã¿åãå°çšã®æ°å€é åïŒãåè¡ã®åãšããŠäœ¿ãã誀ã£ãŠåè¡ãæžãæãããã°ãã³ã³ãã€ã«æã«é²æ¢ããŸã +- æ»ãå€ã® `number[][]` ã®æç€ºã«ãããåŒã³åºãå ã§åãšã©ãŒãèµ·ãã«ãããªããŸã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ã³ã³ãã€ã«æ**ïŒTypeScriptã®ã³ãŒããJavaScriptã«å€æããæ®µéãããã§ãšã©ãŒãæ€åºãããšãããã°ã©ã ãå®è¡ããåã«ãã°ãçºèŠã§ãã +> - **åå®å šæ§**ïŒééã£ãåïŒäŸïŒæ°å€ã®å Žæã«æååãæž¡ããªã©ïŒã®ããŒã¿ãçŽã蟌ãŸãªãããã«å®ãä»çµã¿ +> - **ã€ãã¥ãŒã¿ãã«**ïŒå€æŽã§ããªãã»å€æŽããªãç¶æ ã®ããšãå ã®ããŒã¿ãå£ããªãããããã°ãèµ·ãã«ãã + +--- + +## 2. ã¢ã«ãŽãªãºã ã¢ãããŒãæ¯èŒ + +> ð¡ **ååŠè åãè£è¶³** +> åãåé¡ã§ãè§£ãæ¹ã¯è€æ°ãããŸããããããã®ãéãïŒæéèšç®éïŒïŒåŠçã«ãããæéã®ç®å®ïŒïŒããšãã¡ã¢ãªã®äœ¿ããããïŒç©ºéèšç®éïŒïŒäœ¿ãã¡ã¢ãªéã®ç®å®ïŒïŒããæ¯ã¹ãŠæé©ãªãã®ãéžã³ãŸãã + +| ã¢ãããŒã | æéèšç®é | 空éèšç®é | TSå®è£ ã³ã¹ã | åå®å šæ§ | å¯èªæ§ | åè | +| ----------------------------- | ---------- | ---------- | ------------ | -------- | ------ | --------------------------------------------------------- | +| **A. 鿬¡è¡æ§ç¯ïŒä»åéžæïŒ** | O(n²) | O(n²) | äœ | é« | é« | åã®è¡ã ãèŠãŠæ¬¡ã®è¡ãäœã | +| B. äºé ä¿æ°ã§çŽæ¥èšç® | O(n²) | O(n²) | äž | äž | äž | C(n,k)å ¬åŒã䜿ãã倧ããnã§æŽæ°ãªãŒããŒãããŒã®ãªã¹ã¯ãã | +| C. ååž°ïŒã¡ã¢åãªãïŒ | ææªã§ææ°çïŒååž°å®çŸ©ã§å€å | O(n²) | é« | äž | äœ | åãå€ãäœåºŠãåèšç®ããããéå¹ç | + +> ð¡ **Big-Oèšæ³ã®èªã¿æ¹**ïŒååŠè åãïŒ +> +> - `O(1)`ïŒå ¥åã®å€§ããã«é¢ããããåžžã«äžå®ã®æéã»ã¡ã¢ãª +> - `O(n)`ïŒå ¥åã2åã«ãªããšåŠçãçŽ2å +> - `O(n²)`ïŒå ¥åã2åã«ãªããšåŠçã¯çŽ4åïŒäºéã«ãŒãã«å€ãïŒ + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **äºé ä¿æ°**ïŒçµã¿åããã®æ°ãè¡šãæ°åŠçãªå€ã`C(n, k) = n! / (k! * (n-k)!)` ã§èšç®ã§ããããéä¹ïŒïŒ1Ã2Ã3ÃâŠÃnïŒã倧ãããªããããåé¡ããã +> - **ååž°**ïŒé¢æ°ãèªåèªèº«ãåŒã³åºããŠåé¡ãè§£ãæ¹æ³ãããªãŒæ§é ã®åé¡ã«åãããåŒã³åºããæ·±ããªããšã¡ã¢ãªãæ¶è²»ãã + +--- + +## 3. éžæããã¢ã«ãŽãªãºã ãšçç± + +- **éžæããã¢ãããŒã**: **A. 鿬¡è¡æ§ç¯ïŒã€ãã¬ãŒãã£ãïŒç¹°ãè¿ãåŠçã«ããæ¹æ³ïŒ** +- **çç±**: + - **æ¹æ³Bãéžã°ãªãã£ãçç±**ïŒäºé ä¿æ°ã¯æ°åŒã§äžèŠãšã¬ã¬ã³ãã§ããã`numRows=30`ã®ãšã `30!`ïŒ30ã®éä¹ïŒãšããéåžžã«å€§ããªæ°ãæ±ãå¿ èŠããããJavaScriptã®NumberåïŒïŒæµ®åå°æ°ç¹æ°ïŒã§ç²ŸåºŠãèœã¡ããªã¹ã¯ããããŸã + - **æ¹æ³Cãéžã°ãªãã£ãçç±**ïŒååž°ã¯åãå€ãäœåºŠãèšç®ãçŽããããææªæææ°æéãšãªãå¯èœæ§ãããããã®åé¡ã«ã¯äžåãã§ã + - **æ¹æ³Aãéžãã çç±**ïŒåã®è¡ã ããåç §ããŠæ¬¡ã®è¡ãäœããç©ã¿äžãåŒãã®ãããèšç®ã®ç¡é§ããªããã³ãŒãã®æµãã人éã®çŽæãšäžèŽããŠããŠèªã¿ãããã§ã + +- **TypeScriptç¹æã®æé©åãã€ã³ã**: + - `readonly number[]` ã§åè¡ã®åç §ãä¿è·ãããåè¡ã誀ã£ãŠæžãæãããã°ããã³ã³ãã€ã«æã«é²æ¢ããŸã + - æ»ãå€å `number[][]` ã®æç€ºã«ãããåŒã³åºãå ã§ãåã®æ©æµãåããããŸã + - å ¥åæ€èšŒã颿°åé ã§è¡ããäžæ£ãª `numRows` ãæž¡ããããšãã«åããããããšã©ãŒãè¿ããŸã + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **ã€ãã¬ãŒãã£ã**ïŒã«ãŒãïŒforæãªã©ïŒã§ç¹°ãè¿ãåŠçæ¹æ³ãååž°ãšå¯Ÿæ¯ããŠäœ¿ãèª +> - **æµ®åå°æ°ç¹æ°**ïŒã³ã³ãã¥ãŒã¿ãå°æ°ãè¿äŒŒå€ã§è¡šãæ¹åŒãéåžžã«å€§ããªæŽæ°ãæ±ããšèª€å·®ãçããããšããã +> - **ã³ã³ãã€ã«æãšã©ãŒ**ïŒTypeScriptã®ã³ãŒããJavaScriptã«å€æããéã«çºèŠããããšã©ãŒãå®è¡åã«ãã°ãçºèŠã§ãã + +--- + +## 4. å®è£ ã³ãŒã + +> ð¡ **ãã®ã³ãŒãã®å€§ãŸããªæ§é ïŒéªšæ ŒïŒ** +> +> 1. å ¥åå€ `numRows` ã®æ€èšŒïŒç¯å²å€ã®å€ã匟ãïŒ +> 2. çµæãæ ŒçŽãã空ã®2次å é åãçšæãã +> 3. 1è¡ç®ïŒ`[1]`ïŒãç¡æ¡ä»¶ã§ã»ãããã +> 4. 2è¡ç®ä»¥éã¯ãåã®è¡ããåç §ããŠäž¡ç«¯ã`1`ãå åŽãé£åãå€ã®åã§åãã +> 5. 宿ããäžè§åœ¢å šäœãè¿ã + +```typescript +// Runtime 1 ms +// Beats 33.72% +// Memory 56.02 MB +// Beats 78.88% + +/** + * ãã¹ã«ã«ã®äžè§åœ¢ã®æåã® numRows è¡ãçæããŠè¿ã + * @param numRows - çæããè¡æ°ïŒ1以äž30以äžïŒ + * @returns åè¡ã number[] ã§è¡šãã2次å é å + * @throws {RangeError} numRows ãå¶çŽç¯å²å€ã®ãšã + * @complexity Time: O(n²), Space: O(n²) n = numRows + */ +function generate(numRows: number): number[][] { + // âââ å ¥åæ€èšŒ âââââââââââââââââââââââââââââââââââââââââââââ + // å¶çŽã1 †numRows †30ããæºãããªãå€ãæ¥ããšãã« + // åŸç¶åŠçã§æå³äžæãªãã°ã«ãªãåã«ãåããããããšã©ãŒãæãã + if (!Number.isInteger(numRows) || numRows < 1 || numRows > 30) { + throw new RangeError(`numRows must be an integer between 1 and 30, got: ${numRows}`); + } + + // âââ çµæé åã®æºå âââââââââââââââââââââââââââââââââââââââ + // number[][] = ãæ°å€ã®é åããèŠçŽ ãšããé åïŒ2次å é åïŒ + // TypeScriptãæ»ãå€ã®åãããã§ç¢ºå®ããããããæç€ºçã«åãä»ãã + const triangle: number[][] = []; + + // âââ è¡ã1è¡ãã€ç©ã¿äžãã ââââââââââââââââââââââââââââââââ + for (let rowIndex = 0; rowIndex < numRows; rowIndex++) { + // åè¡ã¯ rowIndex+1 åã®èŠçŽ ãæã€ïŒ0è¡ç®ã¯1åã1è¡ç®ã¯2åâŠïŒ + // Array.from ã§ãé·ãã ãæ±ºãŸã£ãé åããäœãããã¹ãŠ 1 ã§åæåãã + // åæå€ã 1 ã«ããçç±ïŒäž¡ç«¯ã¯å¿ ã 1 ãªã®ã§ãåŸã§ç«¯ä»¥å€ã ãäžæžãããã°æžã + const currentRow: number[] = Array.from({ length: rowIndex + 1 }, () => 1); + + // å åŽã®èŠçŽ ãèšç®ããïŒå é ãšæ«å°Ÿã¯æ¢ã« 1 ãªã®ã§ã¹ãããïŒ + // äŸïŒrowIndex=3 ã®ãšããæŽæ°ããã®ã¯ index 1 ãš 2 ã ã + for (let col = 1; col < rowIndex; col++) { + // åã®è¡ïŒreadonly ãšããŠåç §ïŒã®å·Šäž + å³äž = çŸåšã®ã»ã«ã®å€ + // readonly number[] ãåãšããŠçšããããšã§ãåè¡ã誀ã£ãŠ + // æžãæãããã°ãã³ã³ãã€ã«æã«é²æ¢ããŠããïŒTypeScriptåºæã®æ©æµïŒ + const prevRow: readonly number[] = triangle[rowIndex - 1]; + currentRow[col] = prevRow[col - 1] + prevRow[col]; + } + + // 宿ããè¡ãäžè§åœ¢ã«è¿œå ãã + triangle.push(currentRow); + } + + // å šè¡ãæã£ãäžè§åœ¢ãè¿ã + return triangle; +} +``` + +--- + +### ð¡ ã³ãŒãã®åäœãã¬ãŒã¹ïŒ`numRows = 5` ã®å ŽåïŒ + +å ¥åãã©ã®ããã«å€åããŠããããã¹ãããããšã«è¿œããŸãã + +``` +å ¥å: numRows = 5 + +âââ å ¥åæ€èšŒ âââ +Number.isInteger(5) â true +5 >= 1 ã〠5 <= 30 â æ€èšŒéé â + +âââ ã«ãŒãéå§ âââ + +[rowIndex = 0] + currentRow ã®åæ = [1] (é·ã1ããã¹ãŠ1) + å åŽã«ãŒã: col ã®ç¯å² 1 ïœ -1 â å®è¡ãªãïŒäž¡ç«¯ã ãã®è¡ïŒ + triangle = [[1]] + +[rowIndex = 1] + currentRow ã®åæ = [1, 1] (é·ã2ããã¹ãŠ1) + å åŽã«ãŒã: col ã®ç¯å² 1 ïœ 0 â å®è¡ãªãïŒ1ãš1ã®2èŠçŽ ã ãïŒ + triangle = [[1], [1,1]] + +[rowIndex = 2] + currentRow ã®åæ = [1, 1, 1] (é·ã3ããã¹ãŠ1) + å åŽã«ãŒã: col=1 ã®ã¿ + prevRow = [1, 1] + currentRow[1] = prevRow[0] + prevRow[1] = 1 + 1 = 2 + currentRow ç¢ºå® = [1, 2, 1] + triangle = [[1], [1,1], [1,2,1]] + +[rowIndex = 3] + currentRow ã®åæ = [1, 1, 1, 1] (é·ã4ããã¹ãŠ1) + å åŽã«ãŒã: col=1, col=2 + col=1: prevRow=[1,2,1] â currentRow[1] = 1 + 2 = 3 + col=2: prevRow=[1,2,1] â currentRow[2] = 2 + 1 = 3 + currentRow ç¢ºå® = [1, 3, 3, 1] + triangle = [[1],[1,1],[1,2,1],[1,3,3,1]] + +[rowIndex = 4] + currentRow ã®åæ = [1, 1, 1, 1, 1] (é·ã5ããã¹ãŠ1) + å åŽã«ãŒã: col=1, col=2, col=3 + col=1: prevRow=[1,3,3,1] â currentRow[1] = 1 + 3 = 4 + col=2: prevRow=[1,3,3,1] â currentRow[2] = 3 + 3 = 6 + col=3: prevRow=[1,3,3,1] â currentRow[3] = 3 + 1 = 4 + currentRow ç¢ºå® = [1, 4, 6, 4, 1] + triangle = [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] + +âââ 宿 âââ +åºå: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] â +``` + +> ð **ãã®ã»ã¯ã·ã§ã³ã§ç»å Žããçšèª** +> +> - **`readonly`**ïŒå€æ°ã®å€ã倿Žã§ããªãããã«ããTypeScriptåºæã®ä¿®é£ŸåãJavaScriptã«ã¯ãã®å¶éããªããæå³ãã¬æžãæãããã°ã®åå ã«ãªãããããTypeScriptã§ `readonly` ãä»ãããšã³ã³ãã€ã«æã«æžãæãã鲿¢ã§ãã +> - **`RangeError`**ïŒå€ã®ç¯å²ãäžæ£ãªå Žåã«æãããšã©ãŒã®çš®é¡ãäŸãã°ã1ã30以å€ã®æ°å€ããªã©ãåã¯æ£ãããå€ãäžæ£ãªãšãã«äœ¿ãïŒåãã®ãã®ãéãå Žå㯠`TypeError` ã䜿ãïŒ +> - **`Array.from({ length: n }, () => 1)`**ïŒé·ã `n` ã®é åãäœããå šèŠçŽ ã `1` ã§åæåããã€ãã£ãªã ïŒïŒãã䜿ãããå®çªã®æžãæ¹ïŒã`new Array(n).fill(1)` ãšåã广ã ãããã¡ãã®æ¹ãåæšè«ãšçžæ§ãè¯ã +> - **Pure functionïŒçŽç²é¢æ°ïŒ**ïŒåãå ¥åãäžãããšå¿ ãåãåºåãè¿ããå€éšã®å€æ°ãç¶æ ãæžãæããªã颿°ããã¹ãããããããã°ãèµ·ãã«ãã + +--- + +## 5. LeetCode æåºçšã³ãŒã + +```typescript +function generate(numRows: number): number[][] { + const triangle: number[][] = []; + + for (let rowIndex = 0; rowIndex < numRows; rowIndex++) { + const currentRow: number[] = Array.from({ length: rowIndex + 1 }, () => 1); + + for (let col = 1; col < rowIndex; col++) { + const prevRow: readonly number[] = triangle[rowIndex - 1]; + currentRow[col] = prevRow[col - 1] + prevRow[col]; + } + + triangle.push(currentRow); + } + + return triangle; +} +``` + +--- + +## TypeScriptåºæã®æé©å芳ç¹ãŸãšã + +### åå®å šæ§ã®æŽ»çš + +- **`readonly number[]`**ïŒåè¡ã®åç §ã« `readonly` ãä»ããããšã§ãåè¡ãæžãæããŠããŸãããã°ãã³ã³ãã€ã«æã«æ€åºã§ããŸããJavaScriptã«ã¯ `readonly` ã®æŠå¿µããªããå®è¡ããŠåããŠãã°ã«æ°ã¥ãå ŽåããããŸã +- **`number[][]` ã®æç€º**ïŒæ»ãå€åãæç€ºããããšã§ãåŒã³åºãå ã§ãé åã®åèŠçŽ ã `number[]` ã§ãããšããæ å ±ãäŒãããŸããåãçç¥ãããšãIDEã®è£å®ïŒIntelliSenseïŒã匱ããªããŸã + +### ã³ã³ãã€ã«ææé©å + +- **åæšè«ã®æŽ»çš**ïŒ`Array.from({ length: rowIndex + 1 }, () => 1)` ã®æ»ãå€ã¯ `number[]` ãšèªåæšè«ãããããã`:number[]` ãæç€ºããªããŠãåãã§ãã¯ãæ©èœããŸã +- **`Number.isInteger()`** ã䜿ã£ãå ¥åããªããŒã·ã§ã³ïŒ`typeof numRows === 'number'` ã ãã§ã¯å°æ°ïŒäŸïŒ`5.5`ïŒãéã£ãŠããŸããããããå³å¯ãªæŽæ°ãã§ãã¯ãè¡ã£ãŠããŸã + +### éçºå¹çãšä¿å®æ§ + +- åã«ãŒã倿° `rowIndex`ã»`col` ã«æå³ã®ããååãä»ããããšã§ããäœçªç®ã®è¡ãããäœçªç®ã®åãããäžç®ã§åãããŸã +- `triangle[rowIndex - 1]` ã `prevRow` ãšãã倿°ã«åãåºãããšã§ãã³ãŒãããåã®è¡ãåç §ããŠããããšããæå³ãæç¢ºã«äŒããŸã diff --git a/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/README.md b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/README.md new file mode 100644 index 00000000..d60ca273 --- /dev/null +++ b/Algorithm/Other/leetcode/118. Pascal's Triangle/claude sonnet 4.6 adaptive/README.md @@ -0,0 +1,758 @@ +# Pascal's Triangle - è¡ãç©ã¿äžããŠãã¹ã«ã«ã®äžè§åœ¢ãçæãã + +--- + +## ç®æ¬¡ïŒTable of ContentsïŒ + +- [æŠèŠ](#overview) +- [ã¢ã«ãŽãªãºã èŠç¹ TL;DR](#tldr) +- [å³è§£](#figures) +- [æ£ããã®ã¹ã±ãã](#correctness) +- [èšç®é](#complexity) +- [Python å®è£ ](#impl) +- [CPython æé©åãã€ã³ã](#cpython) +- [ãšããžã±ãŒã¹ãšæ€èšŒèгç¹](#edgecases) +- [FAQ](#faq) + +--- + +
+ è¡ã®ç©ã¿äžãæ³ïŒåçèšç»æ³ïŒã«ãã O(n²) å®è£ +
++ ð¡ + äžèšã§èšããšïŒãäžã®è¡ã ããèŠãŠæ¬¡ã®è¡ã1è¡ãã€ç©ã¿äžãããã¹ã«ã«ã®äžè§åœ¢ãäœãåé¡ã +
+ ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãäžè§åœ¢ã®åœ¢ã«æ°å€ã䞊ã¹ãäžãã1è¡ãã€ç©ã¿äžããŠå®æãããåé¡ã +
++ åè¡ã®å€ã¯ãçäžã®å·Šãšå³ã®å€ãè¶³ãã ããã§æ±ºãŸããŸãããã®ã屿ã«ãŒã«ã®ç©ã¿éãã㯠+ åçèšç»æ³ïŒïŒéšååé¡ã®çããåå©çšããŠå šäœãè§£ãææ³ïŒã®æè¯ãªå ¥éäŸã§ãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+bool ã
+ int
+ ã®ãµãã¯ã©ã¹ãªã®ã§ãåãã§ãã¯ã®é çªã誀ããšãã°ã«ãªãïŒè©³çŽ°ã¯ FAQ
+ åç
§ïŒã
+ + ð¥ å ¥å / ð€ åºåã®äŸ +
+
+ â
ãªããããæ£è§£ãïŒè¡2ã®
+ 2 ã¯è¡1ã®
+ 1+1ã è¡3ã®
+ 3 ã¯è¡2ã®
+ 1+2 ããã³
+ 2+1ããã¹ãŠå®çŸ©éãã
+
+ ð ãã¹ã«ã«ã®äžè§åœ¢ã®ã«ãŒã«ïŒ2ã€ã ãïŒ +
+2 =
+ è¡1ã® 1 + 1
+ + numRows = 5 ãäŸã«ãã¢ã«ãŽãªãºã ã®åã¹ãããã远ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+triangle
+ ã空ã§åæåããfor
+ ã«ãŒãã§è¡ãç©ã¿äžãã
+ _build_row()
+ ãã«ããŒã§æ§ç¯ïŒè¡0ã»è¡1ã¯åºå®å€ãè¿ã
+ [1]+inner+[1]
+ ã§å®æ
+ + âž æ¥åéçºçïŒåæ€èšŒã»ã³ã¡ã³ãä»ãïŒ +
+from __future__ import annotations
+
+
+class Solution:
+ """LeetCode 118: Pascal's Triangle â è¡ã®ç©ã¿äžãæ³"""
+
+ def generate(self, numRows: int) -> list[list[int]]:
+ # ââ å
¥åæ€èšŒïŒåãã§ãã¯ïŒ ââââââââââââââââââââââââââââââââââââ
+ # Python ã§ã¯ bool ã int ã®ãµãã¯ã©ã¹ãªã®ã§å
ã« bool ã匟ã
+ if isinstance(numRows, bool) or not isinstance(numRows, int):
+ raise TypeError(f"numRows must be int, got: {type(numRows).__name__}")
+
+ # ââ å
¥åæ€èšŒïŒç¯å²ãã§ãã¯ïŒ ââââââââââââââââââââââââââââââââââ
+ if numRows < 1 or numRows > 30:
+ raise ValueError(f"numRows must be 1â30, got: {numRows}")
+
+ # ââ çµææ ŒçŽçšãªã¹ã ââââââââââââââââââââââââââââââââââââââââââ
+ triangle: list[list[int]] = []
+
+ # ââ è¡ã 1 è¡ãã€ç©ã¿äžãã âââââââââââââââââââââââââââââââââââ
+ for row_index in range(numRows):
+ current_row = self._build_row(triangle, row_index)
+ triangle.append(current_row)
+
+ return triangle
+
+ def _build_row(self, triangle: list[list[int]], row_index: int) -> list[int]:
+ # åºåºæ¡ä»¶1ïŒè¡0 㯠[1] åºå®ïŒåè¡ãååšããªãã®ã§æ©æãªã¿ãŒã³ïŒ
+ if row_index == 0:
+ return [1]
+
+ # åºåºæ¡ä»¶2ïŒè¡1 㯠[1, 1] åºå®ïŒå
åŽã®èŠçŽ ãååšããªãïŒ
+ if row_index == 1:
+ return [1, 1]
+
+ # è¡2以éïŒåã®è¡ãåç
§ããŠå
åŽã®èŠçŽ ããªã¹ãå
å
衚èšã§èšç®
+ prev: list[int] = triangle[row_index - 1]
+
+ # CPython ã® LIST_APPEND åœä»€ãå¹ããããfor+append ããé«é
+ inner: list[int] = [
+ prev[col - 1] + prev[col] # çäžã®å·Š + çäžã®å³
+ for col in range(1, row_index)
+ ]
+
+ return [1] + inner + [1]
+
+
+ + â¶ å ¥åäŸ numRows = 5 ã§ã®åäœãã¬ãŒã¹ +
++å ¥å: numRows = 5 + +[æ€èšŒ] isinstance(5, bool)âFalse, isinstance(5, int)âTrue, 1â€5â€30 â + +[row_index=0] _build_row([], 0) â [1] triangle=[[1]] +[row_index=1] _build_row(.., 1) â [1,1] triangle=[[1],[1,1]] +[row_index=2] prev=[1,1] + inner: col=1 â 1+1=2 â inner=[2] + return [1]+[2]+[1] = [1,2,1] triangle=[[1],[1,1],[1,2,1]] +[row_index=3] prev=[1,2,1] + inner: col=1â1+2=3, col=2â2+1=3 â inner=[3,3] + return [1,3,3,1] triangle=[..,[1,3,3,1]] +[row_index=4] prev=[1,3,3,1] + inner: col=1â1+3=4, col=2â3+3=6, col=3â3+1=4 â inner=[4,6,4] + return [1,4,6,4,1] triangle=[..,[1,4,6,4,1]] + +åºå: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] â+
+ âž ç«¶æããã°ã©ãã³ã°çïŒLeetCode æåºçšã»æçå®è£ ïŒ +
+class Solution:
+ def generate(self, numRows: int) -> list[list[int]]:
+ tri: list[list[int]] = [[1]]
+ for i in range(1, numRows):
+ p = tri[-1] # tri[-1] â æ«å°Ÿè¡ã O(1) ã§ååŸïŒPython ã®è² ã€ã³ããã¯ã¹ïŒ
+ tri.append([1] + [p[j-1] + p[j] for j in range(1, i)] + [1])
+ return tri
+
+ + ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ numRows = 5 ã§ã®ãããŒè¿œè·¡ +
+isinstance
+ ã§åãšç¯å²ã確èªïŒâ æ€èšŒéé
+ triangle = []
+ ãåæåãã«ãŒãã«å
¥ãã
+ _build_row
+ â row_indexâ€1 â Yes â
+ [1] ã
+ appendã
+ [1,1] ã
+ appendã
+ [1]+inner+[1]
+ â append â row_index++ã
+ triangle
+ ãè¿ãã
+ + ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥å n + ã倧ãããªãã«ã€ãåŠçæéãã©ãå€ãããã®ç®å®ïŒ +
+| + çš®é¡ + | ++ èšç®é + | ++ çç± + | +
|---|---|---|
| + æéèšç®é + | ++ O(n²) + | ++ å šèŠçŽ æ° = 1+2+âŠ+n = n(n+1)/2ãåèŠçŽ ã1床ã ãèšç®ããã + | +
| + 空éèšç®é + | ++ O(n²) + | +
+ å
šè¡ã
+ triangle
+ ã«ä¿æããŠè¿ãããã
+ |
+
| + 1è¡ããã + | ++ O(k) + | ++ k è¡ç®ã®æ§ç¯ã¯ k åã®èŠçŽ ãèšç®ããã ãïŒk ã¯è¡ã€ã³ããã¯ã¹ïŒã + | +
+ ð ãªã O(n²) ã«ãªãã®ãããããŠäžåããªãã®ã +
++ è¡ k ã®èŠçŽ æ°ã¯ k+1 åãªã®ã§ãå šèŠçŽ æ°ã¯ 1+2+3+âŠ+n = n(n+1)/2 â n²/2 + ã§ãããã㯠Big-O 衚èšã§ O(n²) ã«ãªããŸãã + éèŠãªã®ã¯ãåºåèªäœã n²/2 + åã®èŠçŽ ãæã€ããšããç¹ã§ããã©ããªã«è³¢ãã¢ã«ãŽãªãºã ã䜿ã£ãŠãã + åºåãçæããã ãã§ O(n²) ã®æéãå¿ èŠã«ãªããŸãããã® O(n²) + ã¯äžéïŒã©ãããŠãäžåããªãã³ã¹ãïŒã§ããã + æ¬å®è£ ã¯ãã®äžéãéæããŠããŸãã +
++ ð numRows ããšã®èŠçŽ æ°ã®å¢ãæ¹ +
+| + numRows (n) + | +1 | +5 | +10 | +20 | +30 | +
|---|---|---|---|---|---|
| + å šèŠçŽ æ° + | ++ 1 + | ++ 15 + | ++ 55 + | ++ 210 + | ++ 465 + | +
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ãããïŒäºåé³é ïŒ +
+for
+ ã«ãŒãã§ç¹°ãè¿ãããªããžã§ã¯ãã®ç·ç§°ã ãªã¹ãã»ã¿ãã«ã»range()
+ ãªã©ã äŸïŒrange(1, 3)
+ ã¯
+ 1, 2
+ ãé ã«è¿ãã€ãã©ãã«ã
+ for i in range(5)
+ ã¯5åã€ãã¬ãŒã·ã§ã³ããã
+ [1]ïŒãšè¡1ïŒ[1,1]ïŒãåºåºæ¡ä»¶ã
+ å
åŽã®èŠçŽ ãååšããªããããæ±çšããžãã¯ãšã¯å¥ã«åŠçããã
+ triangle
+ ã«ã¯æ£ãããã¹ã«ã«ã®è¡ãå
¥ã£ãŠããããäžå€æ¡ä»¶ã
+ LIST_APPEND
+ ãšããå°çšã®æé©ååœä»€ã«ã³ã³ãã€ã«ããããã éåžžã®
+ for + append()
+ ããé«éã«åäœããã
+ [åŒ for 倿° in ã€ãã©ãã«]
+ ãšãã圢ã§ãªã¹ãã1è¡ã§äœãæžãæ¹ã äŸïŒ[x*2 for x in range(3)]
+ â
+ [0, 2, 4]ã CPython ã®æé©ååœä»€ã䜿ããããããfor + append()
+ ããé«éã
+ return
+ ããããšã§åŸç¶ã®åŠçãã·ã³ãã«ã«ä¿ã€ãã¯ããã¯ã
+ ããã¹ããæ·±ãããªããã³ãŒãã¹ã¿ã€ã«ã®äžã€ã
+ True == 1ãFalse == 0
+ ãšããŠæ±ãããã ãã®ãã
+ isinstance(True, int)
+ ã¯
+ True
+ ãè¿ãã åãã§ãã¯ã§ã¯
+ bool ãå
ã«åŒŸãããšã§ãã®ãã°ãé²ããã
+ + è¡ã®ç©ã¿äžãæ³ïŒåçèšç»æ³ïŒã«ãã O(n²) å®è£ +
++ ð¡ + äžèšã§èšããšïŒãäžã®è¡ã ããèŠãŠæ¬¡ã®è¡ã1è¡ãã€ç©ã¿äžãããã¹ã«ã«ã®äžè§åœ¢ãäœãåé¡ã +
+ ++ ð¡ + ãã®åé¡ãäžèšã§èšããšïŒãäžè§åœ¢ã®åœ¢ã«æ°å€ã䞊ã¹ãäžãã1è¡ãã€ç©ã¿äžããŠå®æãããåé¡ã +
++ åè¡ã®å€ã¯ãçäžã®å·Šãšå³ã®å€ãè¶³ãã ããã§æ±ºãŸããŸãããã®ã屿ã«ãŒã«ã®ç©ã¿éãã㯠+ åçèšç»æ³ïŒïŒéšååé¡ã®çããåå©çšããŠå šäœãè§£ãææ³ïŒã®æè¯ãªå ¥éäŸã§ãã +
++ â ïž ãªãåçŽãªæ¹æ³ã§ã¯è§£ããªãã®ã +
+bool ã
+ int
+ ã®ãµãã¯ã©ã¹ãªã®ã§ãåãã§ãã¯ã®é çªã誀ããšãã°ã«ãªãïŒè©³çŽ°ã¯ FAQ
+ åç
§ïŒã
+ + ð¥ å ¥å / ð€ åºåã®äŸ +
+
+ â
ãªããããæ£è§£ãïŒè¡2ã®
+ 2 ã¯è¡1ã®
+ 1+1ã è¡3ã®
+ 3 ã¯è¡2ã®
+ 1+2 ããã³
+ 2+1ããã¹ãŠå®çŸ©éãã
+
+ ð ãã¹ã«ã«ã®äžè§åœ¢ã®ã«ãŒã«ïŒ2ã€ã ãïŒ +
+2 =
+ è¡1ã® 1 + 1
+ + numRows = 5 ãäŸã«ãã¢ã«ãŽãªãºã ã®åã¹ãããã远ããŸãã +
+ ++ ð ãã®ã³ãŒãã®æ§é ïŒå ã«å šäœåãææ¡ãããïŒ +
+triangle
+ ã空ã§åæåããfor
+ ã«ãŒãã§è¡ãç©ã¿äžãã
+ _build_row()
+ ãã«ããŒã§æ§ç¯ïŒè¡0ã»è¡1ã¯åºå®å€ãè¿ã
+ [1]+inner+[1]
+ ã§å®æ
+ + âž æ¥åéçºçïŒåæ€èšŒã»ã³ã¡ã³ãä»ãïŒ +
+from __future__ import annotations
+
+
+class Solution:
+ """LeetCode 118: Pascal's Triangle â è¡ã®ç©ã¿äžãæ³"""
+
+ def generate(self, numRows: int) -> list[list[int]]:
+ # ââ å
¥åæ€èšŒïŒåãã§ãã¯ïŒ ââââââââââââââââââââââââââââââââââââ
+ # Python ã§ã¯ bool ã int ã®ãµãã¯ã©ã¹ãªã®ã§å
ã« bool ã匟ã
+ if isinstance(numRows, bool) or not isinstance(numRows, int):
+ raise TypeError(f"numRows must be int, got: {type(numRows).__name__}")
+
+ # ââ å
¥åæ€èšŒïŒç¯å²ãã§ãã¯ïŒ ââââââââââââââââââââââââââââââââââ
+ if numRows < 1 or numRows > 30:
+ raise ValueError(f"numRows must be 1â30, got: {numRows}")
+
+ # ââ çµææ ŒçŽçšãªã¹ã ââââââââââââââââââââââââââââââââââââââââââ
+ triangle: list[list[int]] = []
+
+ # ââ è¡ã 1 è¡ãã€ç©ã¿äžãã âââââââââââââââââââââââââââââââââââ
+ for row_index in range(numRows):
+ current_row = self._build_row(triangle, row_index)
+ triangle.append(current_row)
+
+ return triangle
+
+ def _build_row(self, triangle: list[list[int]], row_index: int) -> list[int]:
+ # åºåºæ¡ä»¶1ïŒè¡0 㯠[1] åºå®ïŒåè¡ãååšããªãã®ã§æ©æãªã¿ãŒã³ïŒ
+ if row_index == 0:
+ return [1]
+
+ # åºåºæ¡ä»¶2ïŒè¡1 㯠[1, 1] åºå®ïŒå
åŽã®èŠçŽ ãååšããªãïŒ
+ if row_index == 1:
+ return [1, 1]
+
+ # è¡2以éïŒåã®è¡ãåç
§ããŠå
åŽã®èŠçŽ ããªã¹ãå
å
衚èšã§èšç®
+ prev: list[int] = triangle[row_index - 1]
+
+ # CPython ã® LIST_APPEND åœä»€ãå¹ããããfor+append ããé«é
+ inner: list[int] = [
+ prev[col - 1] + prev[col] # çäžã®å·Š + çäžã®å³
+ for col in range(1, row_index)
+ ]
+
+ return [1] + inner + [1]
+
+
+ + â¶ å ¥åäŸ numRows = 5 ã§ã®åäœãã¬ãŒã¹ +
++å ¥å: numRows = 5 + +[æ€èšŒ] isinstance(5, bool)âFalse, isinstance(5, int)âTrue, 1â€5â€30 â + +[row_index=0] _build_row([], 0) â [1] triangle=[[1]] +[row_index=1] _build_row(.., 1) â [1,1] triangle=[[1],[1,1]] +[row_index=2] prev=[1,1] + inner: col=1 â 1+1=2 â inner=[2] + return [1]+[2]+[1] = [1,2,1] triangle=[[1],[1,1],[1,2,1]] +[row_index=3] prev=[1,2,1] + inner: col=1â1+2=3, col=2â2+1=3 â inner=[3,3] + return [1,3,3,1] triangle=[..,[1,3,3,1]] +[row_index=4] prev=[1,3,3,1] + inner: col=1â1+3=4, col=2â3+3=6, col=3â3+1=4 â inner=[4,6,4] + return [1,4,6,4,1] triangle=[..,[1,4,6,4,1]] + +åºå: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] â+
+ âž ç«¶æããã°ã©ãã³ã°çïŒLeetCode æåºçšã»æçå®è£ ïŒ +
+class Solution:
+ def generate(self, numRows: int) -> list[list[int]]:
+ tri: list[list[int]] = [[1]]
+ for i in range(1, numRows):
+ p = tri[-1] # tri[-1] â æ«å°Ÿè¡ã O(1) ã§ååŸïŒPython ã®è² ã€ã³ããã¯ã¹ïŒ
+ tri.append([1] + [p[j-1] + p[j] for j in range(1, i)] + [1])
+ return tri
+
+ + ðºïž ãããŒãã£ãŒãã®èªã¿æ¹ +
++ ð å ¥åäŸ numRows = 5 ã§ã®ãããŒè¿œè·¡ +
+isinstance
+ ã§åãšç¯å²ã確èªïŒâ æ€èšŒéé
+ triangle = []
+ ãåæåãã«ãŒãã«å
¥ãã
+ _build_row
+ â row_indexâ€1 â Yes â
+ [1] ã
+ appendã
+ [1,1] ã
+ appendã
+ [1]+inner+[1]
+ â append â row_index++ã
+ triangle
+ ãè¿ãã
+ + ð Big-O èšæ³ã®èªã¿æ¹ïŒå ¥å n + ã倧ãããªãã«ã€ãåŠçæéãã©ãå€ãããã®ç®å®ïŒ +
+| + çš®é¡ + | ++ èšç®é + | ++ çç± + | +
|---|---|---|
| + æéèšç®é + | ++ O(n²) + | ++ å šèŠçŽ æ° = 1+2+âŠ+n = n(n+1)/2ãåèŠçŽ ã1床ã ãèšç®ããã + | +
| + 空éèšç®é + | ++ O(n²) + | +
+ å
šè¡ã
+ triangle
+ ã«ä¿æããŠè¿ãããã
+ |
+
| + 1è¡ããã + | ++ O(k) + | ++ k è¡ç®ã®æ§ç¯ã¯ k åã®èŠçŽ ãèšç®ããã ãïŒk ã¯è¡ã€ã³ããã¯ã¹ïŒã + | +
+ ð ãªã O(n²) ã«ãªãã®ãããããŠäžåããªãã®ã +
++ è¡ k ã®èŠçŽ æ°ã¯ k+1 åãªã®ã§ãå šèŠçŽ æ°ã¯ 1+2+3+âŠ+n = n(n+1)/2 â n²/2 + ã§ãããã㯠Big-O 衚èšã§ O(n²) ã«ãªããŸãã + éèŠãªã®ã¯ãåºåèªäœã n²/2 + åã®èŠçŽ ãæã€ããšããç¹ã§ããã©ããªã«è³¢ãã¢ã«ãŽãªãºã ã䜿ã£ãŠãã + åºåãçæããã ãã§ O(n²) ã®æéãå¿ èŠã«ãªããŸãããã® O(n²) + ã¯äžéïŒã©ãããŠãäžåããªãã³ã¹ãïŒã§ããã + æ¬å®è£ ã¯ãã®äžéãéæããŠããŸãã +
++ ð numRows ããšã®èŠçŽ æ°ã®å¢ãæ¹ +
+| + numRows (n) + | +1 | +5 | +10 | +20 | +30 | +
|---|---|---|---|---|---|
| + å šèŠçŽ æ° + | ++ 1 + | ++ 15 + | ++ 55 + | ++ 210 + | ++ 465 + | +
+ ãã®ããŒãžã§ç»å Žããå°éçšèªããŸãšããŸãããåãããªãèšèãåºãŠãããšãã«åç §ããŠãã ãããïŒäºåé³é ïŒ +
+for
+ ã«ãŒãã§ç¹°ãè¿ãããªããžã§ã¯ãã®ç·ç§°ã ãªã¹ãã»ã¿ãã«ã»range()
+ ãªã©ã äŸïŒrange(1, 3)
+ ã¯
+ 1, 2
+ ãé ã«è¿ãã€ãã©ãã«ã
+ for i in range(5)
+ ã¯5åã€ãã¬ãŒã·ã§ã³ããã
+ [1]ïŒãšè¡1ïŒ[1,1]ïŒãåºåºæ¡ä»¶ã
+ å
åŽã®èŠçŽ ãååšããªããããæ±çšããžãã¯ãšã¯å¥ã«åŠçããã
+ triangle
+ ã«ã¯æ£ãããã¹ã«ã«ã®è¡ãå
¥ã£ãŠããããäžå€æ¡ä»¶ã
+ LIST_APPEND
+ ãšããå°çšã®æé©ååœä»€ã«ã³ã³ãã€ã«ããããã éåžžã®
+ for + append()
+ ããé«éã«åäœããã
+ [åŒ for 倿° in ã€ãã©ãã«]
+ ãšãã圢ã§ãªã¹ãã1è¡ã§äœãæžãæ¹ã äŸïŒ[x*2 for x in range(3)]
+ â
+ [0, 2, 4]ã CPython ã®æé©ååœä»€ã䜿ããããããfor + append()
+ ããé«éã
+ return
+ ããããšã§åŸç¶ã®åŠçãã·ã³ãã«ã«ä¿ã€ãã¯ããã¯ã
+ ããã¹ããæ·±ãããªããã³ãŒãã¹ã¿ã€ã«ã®äžã€ã
+ True == 1ãFalse == 0
+ ãšããŠæ±ãããã ãã®ãã
+ isinstance(True, int)
+ ã¯
+ True
+ ãè¿ãã åãã§ãã¯ã§ã¯
+ bool ãå
ã«åŒŸãããšã§ãã®ãã°ãé²ããã
+ 177 interactive lessons across 6 domains
+178 interactive lessons across 6 domains