diff --git a/contains-duplicate/f-exuan21.java b/contains-duplicate/f-exuan21.java new file mode 100644 index 000000000..acb71d219 --- /dev/null +++ b/contains-duplicate/f-exuan21.java @@ -0,0 +1,16 @@ +// time : O(n) +// space : O(n) + +class Solution { + public boolean containsDuplicate(int[] nums) { + Set set = new HashSet<>(); + for(int i : nums) { + if(set.contains(i)) { + return true; + } + set.add(i); + } + return false; + } +} + diff --git a/kth-smallest-element-in-a-bst/f-exuan21.java b/kth-smallest-element-in-a-bst/f-exuan21.java new file mode 100644 index 000000000..95433a739 --- /dev/null +++ b/kth-smallest-element-in-a-bst/f-exuan21.java @@ -0,0 +1,50 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + + private int count = 0; + private TreeNode resultNode = null; + + public int kthSmallest(TreeNode root, int k) { + searchNode(root, k); + return resultNode.val; + } + + public void searchNode(TreeNode node, int k) { + + if(resultNode != null) return; + + if(node.left != null) { + searchNode(node.left, k); + } + + count++; + + if(count == k) { + resultNode = node; + return; + } + + if(node.right != null) { + searchNode(node.right, k); + } + } +} + +// n : 노드 개수 +// time : O(n) 최악의 경우 모든 노드를 탐색해야함 +// space : O(n) 최악의 경우 한 쪽으로 노드가 치우쳐져 있음 +// -> 재귀 호출이 이루어지므로 스택에 쌓임 -> 한 쪽으로 쏠려 있으면 트리의 높이가 n이 됨 (트리의 최대 높이가 스택의 최대 깊이) diff --git a/number-of-1-bits/f-exuan21.java b/number-of-1-bits/f-exuan21.java new file mode 100644 index 000000000..9c06c4329 --- /dev/null +++ b/number-of-1-bits/f-exuan21.java @@ -0,0 +1,16 @@ +// time : O(1) +// space : O(1) + +class Solution { + public int hammingWeight(int n) { + int count = 0; + + while(n != 0) { + if((n&1) == 1) count++; + n = n >> 1; + } + + return count; + } +} + diff --git a/top-k-frequent-elements/f-exuan21.java b/top-k-frequent-elements/f-exuan21.java new file mode 100644 index 000000000..412b6fe93 --- /dev/null +++ b/top-k-frequent-elements/f-exuan21.java @@ -0,0 +1,39 @@ + +class Solution { + public int[] topKFrequent(int[] nums, int k) { + Map map = new HashMap<>(); + for(int num : nums) { + map.put(num, map.getOrDefault(num, 0) + 1); + } + + PriorityQueue> queue = new PriorityQueue<>( + (a, b) -> Integer.compare(b.getValue(), a.getValue()) + ); + + for(Map.Entry entry : map.entrySet()) { + queue.offer(entry); + } + + int[] res = new int[k]; + + for(int i = 0; i < k; i++) { + res[i] = queue.poll().getKey(); + } + + return res; + } +} + +// n : nums의 길이 +// m : nums에서 서로 다른 숫자의 개수 + +// time : O(n) + O(m*logm) + O(k*logm) = O(n + m*logm + k*logm) +// 최악의 경우, nums 가 다 unique 하기 때문에 n == m == k 가 됨 +// 따라서, O(n*logn) + +// space : O(m) + O(m) + O(k) = O(m + k) +// 최악의 경우 n == m == k 가 됨 +// 따라서, O(n) + + +