基礎構文とデータ構造
1. 変数と基本操作
Two Sum(二数の和)
# アプローチ1:全探索
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
# アプローチ2:ハッシュマップ
class Solution:
def twoSum(self, nums, target):
seen = {}
for idx, val in enumerate(nums):
complement = target - val
if complement in seen:
return [seen[complement], idx]
seen[val] = idx
Reverse Integer(整数の反転)
# 文字列スライス方式
class Solution:
def reverse(self, x):
sign = -1 if x < 0 else 1
rev = int(str(abs(x))[::-1]) * sign
return rev if -(2**31) <= rev < 2**31 else 0
# 数学的アプローチ
class Solution:
def reverse(self, x):
sign = -1 if x < 0 else 1
x = abs(x)
result = 0
while x:
result = result * 10 + x % 10
x //= 10
rev = result * sign
return rev if -(2**31) <= rev < 2**31 else 0
Palindrome Number(回文数判定)
class Solution:
def isPalindrome(self, x):
return str(x) == str(x)[::-1]
2. 条件分岐とループ
Roman to Integer(ローマ数字を整数に変換)
class Solution:
def romanToInt(self, s):
mapping = {
'I': 1, 'V': 5, 'X': 10, 'L': 50,
'C': 100, 'D': 500, 'M': 1000,
'IV': 4, 'IX': 9, 'XL': 40,
'XC': 90, 'CD': 400, 'CM': 900
}
total = 0
i = 0
while i < len(s):
if i + 1 < len(s) and s[i:i+2] in mapping:
total += mapping[s[i:i+2]]
i += 2
else:
total += mapping[s[i]]
i += 1
return total
Longest Common Prefix(最長共通接頭辞)
# zipを使った方法
class Solution:
def longestCommonPrefix(self, strs):
prefix = ""
for chars in zip(*strs):
if len(set(chars)) == 1:
prefix += chars[0]
else:
break
return prefix
# 縮小比較方式
class Solution:
def longestCommonPrefix(self, strs):
if not strs:
return ""
candidate = strs[0]
for s in strs[1:]:
while not s.startswith(candidate):
candidate = candidate[:-1]
if not candidate:
return ""
return candidate
# ソート後比較方式
class Solution:
def longestCommonPrefix(self, strs):
if not strs:
return ""
strs.sort()
first, last = strs[0], strs[-1]
i = 0
while i < len(first) and i < len(last) and first[i] == last[i]:
i += 1
return first[:i]
Valid Parentheses(括弧の妥当性検証)
class Solution:
def isValid(self, s):
mapping = {')': '(', ']': '[', '}': '{'}
stack = []
for char in s:
if char in mapping:
top = stack.pop() if stack else '#'
if mapping[char] != top:
return False
else:
stack.append(char)
return not stack
3. リストと文字列操作
Remove Duplicates from Sorted Array(重複要素の削除)
class Solution:
def removeDuplicates(self, nums):
if not nums:
return 0
write_index = 1
for read_index in range(1, len(nums)):
if nums[read_index] != nums[read_index - 1]:
nums[write_index] = nums[read_index]
write_index += 1
return write_index
Length of Last Word(末尾単語の長さ)
class Solution:
def lengthOfLastWord(self, s):
end = len(s) - 1
while end >= 0 and s[end] == ' ':
end -= 1
start = end
while start >= 0 and s[start] != ' ':
start -= 1
return end - start
関数とアルゴリズム基礎
1. 関数と再帰
- Merge Two Sorted Lists
- Climbing Stairs
- Fibonacci Number
2. ソートと探索
- Merge Sorted Array
- Search Insert Position
- First Bad Version
3. 二重ポインタとスライディングウィンドウ
- Move Zeroes
- Reverse String
- Valid Palindrome
データ構造の応用
1. スタックとキュー
- Min Stack
- Implement Queue using Stacks
- Implement Stack using Queues
2. ハッシュテーブルとセット
- Contains Duplicate
- Intersection of Two Arrays
- First Unique Character in a String
3. リンクリスト
- Reverse Linked List
- Linked List Cycle
- Intersection of Two Linked Lists
アルゴリズム思考の深化
1. 貪欲法
- Best Time to Buy and Sell Stock
- Assign Cookies
- Can Place Flowers
2. 分割統治と再帰
- Majority Element
- Maximum Subarray
- Pow(x, n)
3. 動的計画法
- House Robber
- Min Cost Climbing Stairs
- Unique Paths
総合問題
- Container With Most Water
- 3Sum
- Group Anagrams
- Binary Tree Inorder Traversal
- Symmetric Tree