diff --git a/invert-binary-tree/jdy8739.js b/invert-binary-tree/jdy8739.js new file mode 100644 index 000000000..25eafd211 --- /dev/null +++ b/invert-binary-tree/jdy8739.js @@ -0,0 +1,32 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {TreeNode} + */ +var invertTree = function (root) { + const dfs = (node) => { + if (!node) { + return null; + } + + const temp = node.left; + node.left = node.right; + node.right = temp; + + dfs(node.left); + dfs(node.right); + } + + dfs(root); + + return root; +}; + +// 시간복잡도 O(n) 깊이우선탐색으로 모든 노드를 순회하므로 diff --git a/jump-game/jdy8739.js b/jump-game/jdy8739.js new file mode 100644 index 000000000..44f449c16 --- /dev/null +++ b/jump-game/jdy8739.js @@ -0,0 +1,28 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ +var canJump = function (nums) { + const dp = new Array(nums.length).fill(false); + + dp[0] = true; + + for (let i = 0; i < nums.length; i++) { + if (!dp[i]) { + continue; + } + + for (let j = 1; j < nums[i] + 1; j++) { + if (i + j >= nums.length) { + break; + } + + dp[i + j] = true; + } + } + + return dp[dp.length - 1]; +}; + +// 시간복잡도 O(n2) -> nums의 길이대로 순회하면서 1부터 nums[j]의 값까지 순회하는 2중 루프를 돌기 때문 +// 공간복잡도 0(n) -> nums의 길이에 따라 dp 배열의 길이가 결정되므로 diff --git a/maximum-product-subarray/jdy8739.js b/maximum-product-subarray/jdy8739.js index e9685f48d..69c517c52 100644 --- a/maximum-product-subarray/jdy8739.js +++ b/maximum-product-subarray/jdy8739.js @@ -20,5 +20,6 @@ var maxProduct = function (nums) { return answer; }; -// 시간복잡도 O(n) * O(8) -> nums의 길이 만큼을 for 문으로 순환하면서 Math클래스의 max, min메소드를 호출(인자가 3개, 3개, 2개 이므로 총 8회 순회) +// 시간복잡도 O(n) -> nums의 길이 만큼을 for 문 순환하기때문에 // 공간복잡도 O(1) -> 파라미터 nums에 대해 의미있는 공간복잡도를 가지는 변수할당이 없음 + diff --git a/merge-k-sorted-lists/jdy8739.js b/merge-k-sorted-lists/jdy8739.js new file mode 100644 index 000000000..7ac97ee77 --- /dev/null +++ b/merge-k-sorted-lists/jdy8739.js @@ -0,0 +1,44 @@ +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode[]} lists + * @return {ListNode} + */ +var mergeKLists = function (lists) { + const arr = []; + + for (let i = 0; i < lists.length; i++) { + let list = lists[i]; + + while (list) { + arr.push(list.val); + list = list.next; + } + } + + if (!arr.length) { + return null; + } + + arr.sort((a, b) => a - b); + + const first = new ListNode(arr[0]); + + let node = first; + + for (let j = 1; j < arr.length; j++) { + const next = new ListNode(arr[j]); + node.next = next; + node = next; + } + + return first; +}; + +// 시간복잡도 -> for문 이후 sort 이후 for문을 수행하며 이는 O(n) + O(nlogn) + O(n)이므로 O(nlogn)가 시간복잡도가 된다 +// 공간복잡도 -> lists의 노드 수 만큼 길이가 결정되므로 0(n) diff --git a/search-in-rotated-sorted-array/jdy8739.js b/search-in-rotated-sorted-array/jdy8739.js new file mode 100644 index 000000000..f8198e655 --- /dev/null +++ b/search-in-rotated-sorted-array/jdy8739.js @@ -0,0 +1,67 @@ +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +var search = function (nums, target) { + const pivotIndex = findPivot(nums); + + const firstHalfResult = findIndex(nums, 0, pivotIndex - 1, target); + + return firstHalfResult === -1 ? findIndex(nums, pivotIndex, nums.length - 1, target) : firstHalfResult; +}; + +function findIndex(nums, start, end, target) { + while (start <= end) { + // console.log(start, end, target) + const mid = start + Math.floor((end - start) / 2); + + const midValue = nums[mid]; + + if (midValue === target) { + return mid; + } + + if (nums[start] === target) { + return start; + } + + if (nums[end] === target) { + return end; + } + + if (nums[mid] < target) { + start = mid + 1; + } else if (nums[mid] > target) { + end = mid - 1; + } + } + + return -1; +} + + +function findPivot(nums) { + let low = 0; + let high = nums.length - 1; + + while (low <= high) { + const mid = low + Math.floor((high - low) / 2); + + if (0 < mid && nums[mid - 1] > nums[mid]) { + return mid; + } + + if (nums[0] <= nums[mid]) { + low = mid + 1; + } else { + high = mid - 1; + } + + } + + return 0; +} + +// 시간복잡도 O(logn) -> 피봇, 최소값을 찾을 때 이진탐색을 사용하므로 +// 공간복잡도 O(1) -> 고정된 변수 사용 이외에는 동적인 배열, 객체를 사용하지 않으므로