From 426e1eed65f5072f8e09c631261c496461a73099 Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 15 Mar 2026 10:29:10 +0900 Subject: [PATCH 1/2] feat: week2 --- 3sum/soobing3.ts | 27 ++++++++++++++++++++++++ climbing-stairs/soobing3.ts | 14 ++++++++++++ product-of-array-except-self/soobing3.ts | 20 ++++++++++++++++++ valid-anagram/soobing3.ts | 20 ++++++++++++++++++ validate-binary-search-tree/soobing3.ts | 24 +++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 3sum/soobing3.ts create mode 100644 climbing-stairs/soobing3.ts create mode 100644 product-of-array-except-self/soobing3.ts create mode 100644 valid-anagram/soobing3.ts create mode 100644 validate-binary-search-tree/soobing3.ts diff --git a/3sum/soobing3.ts b/3sum/soobing3.ts new file mode 100644 index 0000000000..e42f3778cc --- /dev/null +++ b/3sum/soobing3.ts @@ -0,0 +1,27 @@ +function threeSum(nums: number[]): number[][] { + const result: number[][] = [] + + nums.sort((a: number, b: number) => a-b); + for(let i = 0; i 0 && nums[i] === nums[i - 1]) continue; + let left = i + 1; + let right = nums.length - 1; + + while(left < right) { + const sum = nums[i] + nums[left] + nums[right]; + if(sum === 0) { + result.push([nums[i], nums[left], nums[right]]) + while (left < right && nums[left] === nums[left + 1]) left++; + while (left < right && nums[right] === nums[right - 1]) right--; + + left++; + right--; + } else if(sum < 0) { + left++; + } else { + right--; + } + } + } + return result; +}; \ No newline at end of file diff --git a/climbing-stairs/soobing3.ts b/climbing-stairs/soobing3.ts new file mode 100644 index 0000000000..20e28680eb --- /dev/null +++ b/climbing-stairs/soobing3.ts @@ -0,0 +1,14 @@ +function climbStairs(n: number): number { + const memo = new Map(); + + function dp (n: number): number { + if(n <= 1) return 1; + if(memo.has(n)) return memo.get(n)!; + + const result = dp(n-1) + dp(n-2); + memo.set(n, result); + return result; + } + + return dp(n); +}; \ No newline at end of file diff --git a/product-of-array-except-self/soobing3.ts b/product-of-array-except-self/soobing3.ts new file mode 100644 index 0000000000..537c64c9b4 --- /dev/null +++ b/product-of-array-except-self/soobing3.ts @@ -0,0 +1,20 @@ +function productExceptSelf(nums: number[]): number[] { + const n = nums.length; + const left = new Array(n).fill(1); + const right = new Array(n).fill(1); + const result = new Array(n).fill(1); + + for (let i = 1; i < n; i++) { + left[i] = nums[i-1] * left[i - 1]; + } + + for (let i = n - 2; i >= 0; i--) { + right[i] = nums[i+1] * right[i + 1]; + } + + for (let i = 0; i < n; i++) { + result[i] = left[i] * right[i]; + } + + return result; +}; \ No newline at end of file diff --git a/valid-anagram/soobing3.ts b/valid-anagram/soobing3.ts new file mode 100644 index 0000000000..544c19082d --- /dev/null +++ b/valid-anagram/soobing3.ts @@ -0,0 +1,20 @@ +function isAnagram(s: string, t: string): boolean { + if(s.length !== t.length) return false; + + const sMap = new Map(); + const tMap = new Map(); + + for(const s_char of s) { + sMap.set(s_char, (sMap.get(s_char) ?? 0) + 1); + } + + for(const t_char of t) { + tMap.set(t_char, (tMap.get(t_char) ?? 0) + 1); + } + + if(sMap.size !== tMap.size) return false; + for(const [sKey, sValue] of sMap) { + if(sValue !== tMap.get(sKey)) return false; + } + return true +}; \ No newline at end of file diff --git a/validate-binary-search-tree/soobing3.ts b/validate-binary-search-tree/soobing3.ts new file mode 100644 index 0000000000..3a55eb00f0 --- /dev/null +++ b/validate-binary-search-tree/soobing3.ts @@ -0,0 +1,24 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ + +function isValidBST(root: TreeNode | null): boolean { + function validate(node: TreeNode | null, min: number, max: number){ + if(node === null) return true; + + if(node.val <= min || node.val >= max) return false; + + return validate(node.left, min, node.val) && validate(node.right, node.val, max) + } + return validate(root, -Infinity, Infinity); +}; \ No newline at end of file From ea7dfb90fbf4daef963ca0d71f897a9b3a604ba4 Mon Sep 17 00:00:00 2001 From: soobing Date: Tue, 17 Mar 2026 12:41:16 +0900 Subject: [PATCH 2/2] fix: lint --- 3sum/soobing3.ts | 2 +- climbing-stairs/soobing3.ts | 2 +- product-of-array-except-self/soobing3.ts | 2 +- valid-anagram/soobing3.ts | 2 +- validate-binary-search-tree/soobing3.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/3sum/soobing3.ts b/3sum/soobing3.ts index e42f3778cc..90470282f3 100644 --- a/3sum/soobing3.ts +++ b/3sum/soobing3.ts @@ -24,4 +24,4 @@ function threeSum(nums: number[]): number[][] { } } return result; -}; \ No newline at end of file +}; diff --git a/climbing-stairs/soobing3.ts b/climbing-stairs/soobing3.ts index 20e28680eb..79efb4f201 100644 --- a/climbing-stairs/soobing3.ts +++ b/climbing-stairs/soobing3.ts @@ -11,4 +11,4 @@ function climbStairs(n: number): number { } return dp(n); -}; \ No newline at end of file +}; diff --git a/product-of-array-except-self/soobing3.ts b/product-of-array-except-self/soobing3.ts index 537c64c9b4..e72350b9f7 100644 --- a/product-of-array-except-self/soobing3.ts +++ b/product-of-array-except-self/soobing3.ts @@ -17,4 +17,4 @@ function productExceptSelf(nums: number[]): number[] { } return result; -}; \ No newline at end of file +}; diff --git a/valid-anagram/soobing3.ts b/valid-anagram/soobing3.ts index 544c19082d..66e505f804 100644 --- a/valid-anagram/soobing3.ts +++ b/valid-anagram/soobing3.ts @@ -17,4 +17,4 @@ function isAnagram(s: string, t: string): boolean { if(sValue !== tMap.get(sKey)) return false; } return true -}; \ No newline at end of file +}; diff --git a/validate-binary-search-tree/soobing3.ts b/validate-binary-search-tree/soobing3.ts index 3a55eb00f0..0d77d8bdff 100644 --- a/validate-binary-search-tree/soobing3.ts +++ b/validate-binary-search-tree/soobing3.ts @@ -21,4 +21,4 @@ function isValidBST(root: TreeNode | null): boolean { return validate(node.left, min, node.val) && validate(node.right, node.val, max) } return validate(root, -Infinity, Infinity); -}; \ No newline at end of file +};