diff --git a/linked-list-cycle/printjin-gmailcom.py b/linked-list-cycle/printjin-gmailcom.py new file mode 100644 index 000000000..283f161fe --- /dev/null +++ b/linked-list-cycle/printjin-gmailcom.py @@ -0,0 +1,9 @@ +class Solution: + def hasCycle(self, head): + slow = fast = head + while fast and fast.next: + slow = slow.next + fast = fast.next.next + if slow == fast: + return True + return False diff --git a/maximum-product-subarray/printjin-gmailcom.py b/maximum-product-subarray/printjin-gmailcom.py new file mode 100644 index 000000000..3e3908c3c --- /dev/null +++ b/maximum-product-subarray/printjin-gmailcom.py @@ -0,0 +1,9 @@ +class Solution: + def maxProduct(self, nums): + max_prod = min_prod = result = nums[0] + for n in nums[1:]: + temp_max = max(n, max_prod * n, min_prod * n) + min_prod = min(n, max_prod * n, min_prod * n) + max_prod = temp_max + result = max(result, max_prod) + return result diff --git a/minimum-window-substring/printjin-gmailcom.py b/minimum-window-substring/printjin-gmailcom.py new file mode 100644 index 000000000..05553bbce --- /dev/null +++ b/minimum-window-substring/printjin-gmailcom.py @@ -0,0 +1,19 @@ +from collections import Counter + +class Solution: + def minWindow(self, s: str, t: str) -> str: + need = Counter(t) + missing = len(t) + left = start = end = 0 + for right, char in enumerate(s): + if need[char] > 0: + missing -= 1 + need[char] -= 1 + while missing == 0: + if end == 0 or right - left < end - start: + start, end = left, right + 1 + need[s[left]] += 1 + if need[s[left]] > 0: + missing += 1 + left += 1 + return s[start:end] diff --git a/pacific-atlantic-water-flow/printjin-gmailcom.py b/pacific-atlantic-water-flow/printjin-gmailcom.py new file mode 100644 index 000000000..8d6124dd4 --- /dev/null +++ b/pacific-atlantic-water-flow/printjin-gmailcom.py @@ -0,0 +1,25 @@ +class Solution: + def pacificAtlantic(self, heights): + if not heights: + return [] + m, n = len(heights), len(heights[0]) + pacific = [[False] * n for _ in range(m)] + atlantic = [[False] * n for _ in range(m)] + def dfs(r, c, visited): + visited[r][c] = True + for dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]: + nr, nc = r + dr, c + dc + if 0 <= nr < m and 0 <= nc < n and not visited[nr][nc] and heights[nr][nc] >= heights[r][c]: + dfs(nr, nc, visited) + for i in range(m): + dfs(i, 0, pacific) + dfs(i, n - 1, atlantic) + for j in range(n): + dfs(0, j, pacific) + dfs(m - 1, j, atlantic) + result = [] + for r in range(m): + for c in range(n): + if pacific[r][c] and atlantic[r][c]: + result.append([r, c]) + return result diff --git a/sum-of-two-integers/printjin-gmailcom.py b/sum-of-two-integers/printjin-gmailcom.py new file mode 100644 index 000000000..00bc161c4 --- /dev/null +++ b/sum-of-two-integers/printjin-gmailcom.py @@ -0,0 +1,17 @@ +# recheck needs to be done + +class Solution: + def getSum(self, a, b): + MASK = 0xFFFFFFFF # 32비트 정수를 흉내 내기 위한 마스크 (십진수로는 4294967295) + MAX_INT = 0x7FFFFFFF # 32비트에서의 양수 최댓값 (2147483647) + + while b != 0: + # a ^ b: 자리올림(carry) 없이 더한 값 + # a & b: 같은 자리에 1이 있으면 자리올림이 생긴다는 의미 + # (a & b) << 1: 자리올림을 왼쪽으로 이동하여 실제 올림 연산 위치로 맞춤 + a, b = (a ^ b) & MASK, ((a & b) << 1) & MASK + + # 최종적으로 a에 정답이 들어감 + # 그런데 32비트 부호있는 정수에서는 양수 최대값이 MAX_INT + # a > MAX_INT라면 음수라는 뜻이므로, 보수 처리를 해줌 + return a if a <= MAX_INT else ~(a ^ MASK)