Pythonによるアルゴリズム実装入門

基礎構文とデータ構造

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

タグ: Python アルゴリズム データ構造 LeetCode 動的計画法

7月13日 00:57 投稿