Two Sum - tanakakenji/Rinko GitHub Wiki

ๅ•้กŒ:

ๆ•ดๆ•ฐใฎ้…ๅˆ— nums ใจๆ•ดๆ•ฐใฎ target ใŒไธŽใˆใ‚‰ใ‚ŒใŸใจใใ€ใใ‚Œใ‚‰ใ‚’่ถณใ—ๅˆใ‚ใ›ใ‚‹ใจ target ใซใชใ‚‹ใ‚ˆใ†ใช2ใคใฎๆ•ฐใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’่ฟ”ใ—ใฆใใ ใ•ใ„ใ€‚

ๅ„ๅ…ฅๅŠ›ใซใฏๆญฃ็ขบใซ1ใคใฎ่งฃใŒๅญ˜ๅœจใ™ใ‚‹ใจไปฎๅฎšใ—ใฆใ‚ˆใใ€ๅŒใ˜่ฆ็ด ใ‚’2ๅ›žไฝฟ็”จใ™ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚

็ญ”ใˆใฏไปปๆ„ใฎ้ †ๅบใง่ฟ”ใ™ใ“ใจใŒใงใใพใ™ใ€‚

ไพ‹:

Example 1:
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: nums[0] + nums[1] == 9 ใชใฎใงใ€[0, 1] ใ‚’่ฟ”ใ—ใพใ™ใ€‚

Example 2:
Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:
Input: nums = [3,3], target = 6
Output: [0,1]

ๅˆถ็ด„:

2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
ๆœ‰ๅŠนใช็ญ”ใˆใฏ1ใคใ ใ‘ๅญ˜ๅœจใ—ใพใ™ใ€‚

ใƒ•ใ‚ฉใƒญใƒผใ‚ขใƒƒใƒ—: O(n^2) ๆœชๆบ€ใฎๆ™‚้–“่จˆ็ฎ—้‡ใ‚’ๆŒใคใ‚ขใƒซใ‚ดใƒชใ‚บใƒ ใ‚’่€ƒๆกˆใงใใพใ™ใ‹๏ผŸ

ๅ›ž็ญ”ใจ่งฃ่ชฌ:

ใ“ใฎๅ•้กŒใฏใ€้…ๅˆ—ใฎไธญใ‹ใ‚‰2ใคใฎๆ•ฐใ‚’่ฆ‹ใคใ‘ใ€ใใ‚Œใ‚‰ใฎๅˆ่จˆใŒๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฟใƒผใ‚ฒใƒƒใƒˆๅ€คใซใชใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ๅคๅ…ธ็š„ใชใ€ŒTwo Sumใ€ๅ•้กŒใงใ™ใ€‚

ๅŸบๆœฌ็š„ใชใ‚ขใƒ—ใƒญใƒผใƒ (Brute Force):

ๆœ€ใ‚‚็ฐกๅ˜ใชใ‚ขใƒ—ใƒญใƒผใƒใฏใ€้…ๅˆ—ๅ†…ใฎใ™ในใฆใฎๅฏ่ƒฝใชใƒšใ‚ขใ‚’่ฉฆใ™ใ“ใจใงใ™ใ€‚

def twoSum_bruteforce(nums: list[int], target: int) -> list[int]:
    n = len(nums)
    for i in range(n):
        for j in range(i + 1, n):
            if nums[i] + nums[j] == target:
                return [i, j]
    return [] # ่งฃใŒ่ฆ‹ใคใ‹ใ‚‰ใชใ„ๅ ดๅˆใฏ็ฉบใฎใƒชใ‚นใƒˆใ‚’่ฟ”ใ™ (ใŸใ ใ—ใ€ๅ•้กŒๆ–‡ใงใฏๅฟ…ใš่งฃใŒๅญ˜ๅœจใ™ใ‚‹ใจใ•ใ‚Œใฆใ„ใพใ™)

# ไพ‹
nums1 = [2,7,11,15]
target1 = 9
print(twoSum_bruteforce(nums1, target1))  # Output: [0, 1]

nums2 = [3,2,4]
target2 = 6
print(twoSum_bruteforce(nums2, target2))  # Output: [1, 2]

nums3 = [3,3]
target3 = 6
print(twoSum_bruteforce(nums3, target3))  # Output: [0, 1]

ๆ™‚้–“่จˆ็ฎ—้‡: ใ“ใฎใ‚ขใƒ—ใƒญใƒผใƒใงใฏใ€ใƒใ‚นใƒˆใ•ใ‚ŒใŸใƒซใƒผใƒ—ใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ใŸใ‚ใ€ๆ™‚้–“่จˆ็ฎ—้‡ใฏ O(n^2) ใงใ™ใ€‚

ๅŠน็އ็š„ใชใ‚ขใƒ—ใƒญใƒผใƒ (ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‚’ไฝฟ็”จ):

ใ‚ˆใ‚ŠๅŠน็އ็š„ใชใ‚ขใƒ—ใƒญใƒผใƒใฏใ€ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— (่พžๆ›ธ) ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใงใ™ใ€‚้…ๅˆ—ใ‚’ไธ€ๅบฆใ ใ‘ๅๅพฉๅ‡ฆ็†ใ—ใชใŒใ‚‰ใ€ๅ„ๆ•ฐๅ€คใซๅฏพใ—ใฆใ€ใ‚ฟใƒผใ‚ฒใƒƒใƒˆๅ€คใซ้”ใ™ใ‚‹ใŸใ‚ใซๅฟ…่ฆใช่ฃœๆ•ฐใŒใ™ใงใซใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใซๅญ˜ๅœจใ™ใ‚‹ใ‹ใฉใ†ใ‹ใ‚’็ขบ่ชใ—ใพใ™ใ€‚

def twoSum_hashmap(nums: list[int], target: int) -> list[int]:
    seen = {}  # ๆ•ฐๅ€คใจใใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ๆ ผ็ดใ™ใ‚‹ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—
    for index, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], index]
        seen[num] = index
    return [] # ่งฃใŒ่ฆ‹ใคใ‹ใ‚‰ใชใ„ๅ ดๅˆใฏ็ฉบใฎใƒชใ‚นใƒˆใ‚’่ฟ”ใ™ (ใŸใ ใ—ใ€ๅ•้กŒๆ–‡ใงใฏๅฟ…ใš่งฃใŒๅญ˜ๅœจใ™ใ‚‹ใจใ•ใ‚Œใฆใ„ใพใ™)

# ไพ‹
nums1 = [2,7,11,15]
target1 = 9
print(twoSum_hashmap(nums1, target1))  # Output: [0, 1]

nums2 = [3,2,4]
target2 = 6
print(twoSum_hashmap(nums2, target2))  # Output: [1, 2]

nums3 = [3,3]
target3 = 6
print(twoSum_hashmap(nums3, target3))  # Output: [0, 1]

่งฃ่ชฌ:

  1. ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— seen ใฎๅˆๆœŸๅŒ–: ็ฉบใฎ่พžๆ›ธ seen ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ใ“ใฎ่พžๆ›ธใฏใ€ใ™ใงใซๅๅพฉๅ‡ฆ็†ใ—ใŸๆ•ฐๅ€คใจใใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ๆ ผ็ดใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚

  2. ้…ๅˆ—ใฎๅๅพฉๅ‡ฆ็†: enumerate ใ‚’ไฝฟ็”จใ—ใฆใ€้…ๅˆ— nums ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใจๅ€คใ‚’ๅŒๆ™‚ใซๅๅพฉๅ‡ฆ็†ใ—ใพใ™ใ€‚

  3. ่ฃœๆ•ฐใฎ่จˆ็ฎ—: ็พๅœจใฎๆ•ฐๅ€ค num ใซๅฏพใ—ใฆใ€ใ‚ฟใƒผใ‚ฒใƒƒใƒˆๅ€คใซ้”ใ™ใ‚‹ใŸใ‚ใซๅฟ…่ฆใช่ฃœๆ•ฐ complement ใ‚’่จˆ็ฎ—ใ—ใพใ™ (complement = target - num)ใ€‚

  4. ่ฃœๆ•ฐใฎๅญ˜ๅœจ็ขบ่ช: ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— seen ใซ complement ใŒใ‚ญใƒผใจใ—ใฆๅญ˜ๅœจใ™ใ‚‹ใ‹ใฉใ†ใ‹ใ‚’็ขบ่ชใ—ใพใ™ใ€‚

    • ๅญ˜ๅœจใ™ใ‚‹ๅ ดๅˆใ€ใใ‚Œใฏไปฅๅ‰ใซๅๅพฉๅ‡ฆ็†ใ—ใŸๆ•ฐๅ€คใฎไธญใซใ€็พๅœจใฎๆ•ฐๅ€คใจ่ถณใ—ๅˆใ‚ใ›ใ‚‹ใจ target ใซใชใ‚‹ๆ•ฐๅ€คใŒๅญ˜ๅœจใ™ใ‚‹ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™ใ€‚
    • ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‹ใ‚‰่ฃœๆ•ฐใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ๅ–ๅพ—ใ—ใ€็พๅœจใฎๆ•ฐๅ€คใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใจใจใ‚‚ใซ่ฟ”ใ—ใพใ™ใ€‚
  5. ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใธใฎ่ฟฝๅŠ : ่ฃœๆ•ฐใŒใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใซ่ฆ‹ใคใ‹ใ‚‰ใชใ„ๅ ดๅˆใ€็พๅœจใฎๆ•ฐๅ€ค num ใจใใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— seen ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ๅพŒ็ถšใฎๅๅพฉๅ‡ฆ็†ใงใ“ใฎๆ•ฐๅ€คใŒ่ฃœๆ•ฐใจใ—ใฆๅฟ…่ฆใซใชใฃใŸๅ ดๅˆใซใ€ๅŠน็އ็š„ใซๆคœ็ดขใงใใพใ™ใ€‚

ๆ™‚้–“่จˆ็ฎ—้‡: ใ“ใฎใ‚ขใƒ—ใƒญใƒผใƒใงใฏใ€้…ๅˆ—ใ‚’ไธ€ๅบฆใ ใ‘ๅๅพฉๅ‡ฆ็†ใ—ใ€ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใธใฎใ‚ขใ‚ฏใ‚ปใ‚นใฏๅนณๅ‡ใ—ใฆ O(1) ใฎๆ™‚้–“ใง่กŒใ‚ใ‚Œใ‚‹ใŸใ‚ใ€ๅ…จไฝ“ใฎๆ™‚้–“่จˆ็ฎ—้‡ใฏ O(n) ใงใ™ใ€‚

็ฉบ้–“่จˆ็ฎ—้‡: ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— seen ใซใฏใ€ๆœ€ๆ‚ชใฎๅ ดๅˆใ€้…ๅˆ—ใฎใ™ในใฆใฎ่ฆ็ด ใŒๆ ผ็ดใ•ใ‚Œใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹ใŸใ‚ใ€็ฉบ้–“่จˆ็ฎ—้‡ใฏ O(n) ใงใ™ใ€‚

ใƒ•ใ‚ฉใƒญใƒผใ‚ขใƒƒใƒ—ใธใฎๅ›ž็ญ”:

ใฏใ„ใ€ๅŠน็އ็š„ใชใ‚ขใƒ—ใƒญใƒผใƒ (ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‚’ไฝฟ็”จ) ใฏ O(n) ใฎๆ™‚้–“่จˆ็ฎ—้‡ใ‚’ๆŒใฃใฆใŠใ‚Šใ€O(n^2) ๆœชๆบ€ใงใ™ใ€‚ใ“ใ‚Œใฏใ€ใƒ•ใ‚ฉใƒญใƒผใ‚ขใƒƒใƒ—ใฎ่ฆๆฑ‚ใ‚’ๆบ€ใŸใ—ใฆใ„ใพใ™ใ€‚

ใ“ใฎใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ขใƒ—ใƒญใƒผใƒใฏใ€Two Sum ๅ•้กŒใฎๆจ™ๆบ–็š„ใชๅŠน็އ็š„ใช่งฃๆณ•ใจใ—ใฆๅบƒใ็Ÿฅใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚