diff --git a/3sum/mrlee7.py b/3sum/mrlee7.py new file mode 100644 index 000000000..d84f6a902 --- /dev/null +++ b/3sum/mrlee7.py @@ -0,0 +1,34 @@ +from typing import List + + +class Solution: + def threeSum(self, nums: List[int]) -> List[List[int]]: + result: List[List[int]] = [] + nums.sort() + + for i in range(len(nums) - 2): + if i > 0 and nums[i] == nums[i - 1]: + continue + + left = i + 1 + right = len(nums) - 1 + + while left < right: + total = nums[i] + nums[left] + nums[right] + + if total == 0: + result.append([nums[i], nums[left], nums[right]]) + left += 1 + right -= 1 + + while left < right and nums[left] == nums[left - 1]: + left += 1 + while left < right and nums[right] == nums[right + 1]: + right -= 1 + + elif total < 0: + left += 1 + else: + right -= 1 + + return result diff --git a/climbing-stairs/mrlee7.py b/climbing-stairs/mrlee7.py new file mode 100644 index 000000000..42403eb19 --- /dev/null +++ b/climbing-stairs/mrlee7.py @@ -0,0 +1,8 @@ +class Solution: + def climbStairs(self, n: int) -> int: + stairs = {1: 1, 2: 2} + + for i in range(3, n + 1): + stairs[i] = stairs[i - 1] + stairs[i - 2] + + return stairs[n] diff --git a/longest-consecutive-sequence/mrlee7.py b/longest-consecutive-sequence/mrlee7.py new file mode 100644 index 000000000..eeb18ec35 --- /dev/null +++ b/longest-consecutive-sequence/mrlee7.py @@ -0,0 +1,36 @@ +from typing import List + +""" +Ideation: + 배열을 정렬한 뒤, 인접한 숫자들을 비교하면서 가장 긴 연속 수열의 길이를 구한다. + + - 같은 숫자는 중복이므로 건너뛴다. + - 현재 숫자 + 1 이 다음 숫자와 같으면 연속된 수이므로 길이를 증가시킨다. + - 연속이 끊기면 최대 길이를 갱신하고 길이를 1로 초기화한다. + +Time Complexity: O(n log n) +Space Complexity: O(1) +""" + + +class Solution: + + def longestConsecutive(self, nums: List[int]) -> int: + if len(nums) == 0: + return 0 + + longest = 0 + length = 1 + + nums.sort() + + for idx in range(len(nums) - 1): + if nums[idx] == nums[idx + 1]: + continue + if nums[idx] + 1 == nums[idx + 1]: + length += 1 + else: + longest = max(longest, length) + length = 1 + longest = max(longest, length) + return longest diff --git a/product-of-array-except-self/mrlee7.py b/product-of-array-except-self/mrlee7.py new file mode 100644 index 000000000..3b732920a --- /dev/null +++ b/product-of-array-except-self/mrlee7.py @@ -0,0 +1,18 @@ +from typing import List + + +class Solution: + def productExceptSelf(self, nums: List[int]) -> List[int]: + result = [0] * len(nums) + + prefix_product = 1 + for index in range(len(nums)): + result[index] = prefix_product + prefix_product *= nums[index] + + suffix_product = 1 + for index in range(len(nums) - 1, -1, -1): + result[index] *= suffix_product + suffix_product *= nums[index] + + return result diff --git a/top-k-frequent-elements/mrlee7.py b/top-k-frequent-elements/mrlee7.py new file mode 100644 index 000000000..17c1a8213 --- /dev/null +++ b/top-k-frequent-elements/mrlee7.py @@ -0,0 +1,19 @@ +from typing import List + +""" +Ideation + 해시맵에 각 원소별 빈도수를 저장한 뒤, 빈도수 높은 순으로 정렬한 다음 앞에서 k개를 반환합니다. +Time Complexity: O(n) +Space Complexity: O(n + m log m) +""" + +class Solution: + def topKFrequent(self, nums: List[int], k: int) -> List[int]: + frequency = {} + for num in nums: + frequency[num] = frequency.get(num, 0) + 1 + sorted_nums = sorted(frequency, key=lambda num: frequency[num], reverse=True) + + return sorted_nums[:k] + + diff --git a/valid-anagram/mrlee7.py b/valid-anagram/mrlee7.py new file mode 100644 index 000000000..e0738152b --- /dev/null +++ b/valid-anagram/mrlee7.py @@ -0,0 +1,11 @@ +class Solution: + """ + Ideation: + 애너그램은 문자열 내 배치만 다를 뿐, 동일한 문자들이 동일한 카운트로 보장되어야 한다. + 이를 위해 문자 기준으로 정렬하고 같은지 확인합니다. + Time Complexity: O(n log n) + Space Complexity: O(1) + """ + + def isAnagram(self, s: str, t: str) -> bool: + return sorted(s) == sorted(t)