1. Two Sum Link : https://leetcode.com/problems/two-sum/description/?difficulty=EASY
Hash Map (딕셔너리 이용) 보조 공간을 이용해 빠르게 차이를 찾는 방식.
시간 복잡도: O(n)
공간 복잡도: O(n)
1 2 3 4 5 6 7 8 9 10 11 class Solution : def twoSum (self, nums: List [int ], target: int ) -> List [int ]: num_map = {} for index, num in enumerate (nums): diff = target - num if diff in num_map: return [num_map[diff], index] num_map[num] = index
Sorting + Two Pointers (정렬 + 투 포인터) 정렬 후 양 끝에서 합을 비교.
시간 복잡도: O(n log n)
공간 복잡도: O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def twoSum (self, nums: List [int ], target: int ) -> List [int ]: arr = [(num, i) for i, num in enumerate (nums)] arr.sort() left, right = 0 , len (arr) - 1 while left < right: s = arr[left][0 ] + arr[right][0 ] if s == target: return [arr[left][1 ], arr[right][1 ]] elif s < target: left +=1 else : right -=1
2. Add Two Numbers Link : https://leetcode.com/problems/add-two-numbers/description/?difficulty=EASY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def addTwoNumbers (self, l1: Optional [ListNode], l2: Optional [ListNode], c=0 ) -> Optional [ListNode]: sum_ = l1.val + l2.val + c remain = sum_ % 10 carry = sum_ // 10 new_node = ListNode(remain) if l1.next != None or l2.next !=None or carry != 0 : if l1.next == None : l1.next = ListNode(0 ) if l2.next == None : l2.next = ListNode(0 ) new_node.next = self .addTwoNumbers(l1.next , l2.next , carry) return new_node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Solution : def addTwoNumbers (self, l1: Optional [ListNode], l2: Optional [ListNode] ) -> Optional [ListNode]: dummy = ListNode(0 ) current = dummy carry = 0 while l1 or l2 or carry: val1 = l1.val if l1 else 0 val2 = l2.val if l2 else 0 total = val1 + val2 + carry remain = total % 10 carry = total // 10 current.next = ListNode(remain) current = current.next if l1: l1 = l1.next if l2: l2 = l2.next return dummy.next
3. Longest Substring Without Repeating Characters Link : https://leetcode.com/problems/longest-substring-without-repeating-characters/description/?difficulty=EASY
1 2 3 4 5 6 7 8 9 10 11 12 13 class Solution : def lengthOfLongestSubstring (self, s: str ) -> int : max_num = 0 temp = [] for i in range (len (s)): while s[i] in temp: temp.pop(0 ) temp.append(s[i]) max_num = max (len (temp), max_num) return max_num
투 포인터 + set
같은 슬라이딩 윈도우인데 set으로 포함 여부를 O(1)에 체크.
왼쪽 포인터(left)를 움직이며 중복을 제거.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Solution : def lengthOfLongestSubstring (self, s: str ) -> int : max_num = 0 left = 0 temp = set () for right, ch in enumerate (s): while ch in temp: temp.remove(s[left]) left += 1 temp.add(ch) max_num = max (max_num, len (temp)) return max_num
5. Longest Palindromic Substring Link : https://leetcode.com/problems/longest-palindromic-substring/?difficulty=EASY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Solution : def longestPalindrome (self, s: str ) -> str : if len (s) <= 1 : return s def expand (left, right ): while left >= 0 and right < len (s) and s[left] == s[right]: left -= 1 right +=1 return s[left+1 : right] max_str = s[0 ] for i in range (len (s)-1 ): odd = expand(i, i) even = expand(i, i+1 ) if len (odd) > len (max_str): max_str = odd if len (even) > len (max_str): max_str = even return max_str
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Solution : def longestPalindrome (self, s: str ) -> str : if len (s) < 2 : return s def expand (left, right ): while left >= 0 and right < len (s) and s[left] == s[right]: left -= 1 right += 1 return left+1 , right max_str = '' for i in range (len (s)): l1, r1 = expand(i, i) l2, r2 = expand(i, i+1 ) odd_str = s[l1:r1] even_str = s[l2:r2] if len (odd_str) > len (max_str): max_str = odd_str if len (even_str) > len (max_str): max_str = even_str return max_str
6. Zigzag Conversion Link : https://leetcode.com/problems/zigzag-conversion/description/?difficulty=EASY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Solution : def convert (self, s: str , numRows: int ) -> str : if numRows == 1 or numRows >= len (s): return s rows = [[] for row in range (numRows)] index = 0 step = 1 for char in s: rows[index].append(char) if index == 0 : step = 1 elif index == numRows-1 : step = -1 index += step for i in range (numRows): rows[i] = '' .join(rows[i]) return '' .join(rows)