leetcode && orb slam3 4/99--> LeetCode 1: Two Sum

Perfect choice 🙌 Let’s analyze LeetCode 1: Two Sum both as a coding problem and in analogy to ORB-SLAM3.


🧩 LeetCode 1: Two Sum

Problem

Given an array of integers nums and a target integer target, return indices of the two numbers such that they add up to target.

Example:

nums = [2,7,11,15], target = 9  
Output = [0,1]  # because nums[0] + nums[1] = 2 + 7 = 9

1️⃣ Core Ideas

  • Naïve approach:
    Check every pair → O(n²).

  • Optimal approach:
    Use a hash map to remember numbers we’ve seen so far.

    • While iterating, check if target - num exists in the hash map.
    • If yes → found a solution.
    • Else → store num in the hash map.

Time: O(n)
Space: O(n)


Python solution

def twoSum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], i]
        seen[num] = i

2️⃣ Why It’s Important

  • This is one of the classic problems that teaches:

    • Hash maps (dictionary lookups in O(1))
    • Complement logic (finding pairs efficiently)
    • Time–space tradeoff (extra memory for speed)

🛰️ ORB-SLAM3 Analogy

Now let’s map this to SLAM concepts.


🔹 Problem analogy

  • In Two Sum → find two numbers that satisfy a condition (sum = target).
  • In ORB-SLAM3 → often we must find pairs of features that satisfy a condition (e.g., match descriptors between frames).

🔹 Hash Map Analogy

  • In Two Sum → we store numbers in a hash map for fast lookup.

  • In ORB-SLAM3 →

    • ORB descriptors are stored in data structures (like vocab tree, inverted index).
    • When matching features, we look up whether a complementary feature exists in another frame.

🔹 Example Mapping

Two Sum ConceptORB-SLAM3 Equivalent
Array of numbersSet of feature descriptors
Target sumGeometric/descriptor constraint
Hash map lookupVocabulary tree / inverted index search
Return indices of numbersReturn matched feature IDs between frames

🔹 Specific file parallels

  • Two Sum’s complement check is like:
    KeyFrameDatabase::DetectLoopCandidates() → checking if another keyframe has enough common visual words (the “complement” for relocalization).

  • Feature matching code in:

    • ORBmatcher.cc (fast lookup of matches)
    • Works conceptually like hash map lookups in Two Sum.

✅ Summary

  • LeetCode Two Sum teaches:

    • Hash maps, complements, efficient O(n) lookups.
  • ORB-SLAM3 analogy:

    • Two Sum’s “complement” = SLAM’s “matching feature/word”
    • Hash map = Vocabulary tree / inverted index
    • Return pair of indices = Return matched keypoints / keyframes

👉 Practicing Two Sum builds intuition for fast pair finding in SLAM (matching features, loop detection), where a naïve O(n²) brute force is too slow.


note1: {} in python

Got it 👍 You’re asking about this line in the Two Sum solution:

seen = {}

Let’s break it down step by step for someone new to Python.


1️⃣ What {} means in Python

  • {} by itself creates an empty dictionary.
  • A dictionary is a data structure in Python that stores key–value pairs.

Example:

person = {"name": "Alice", "age": 25}
print(person["name"])  # Alice
print(person["age"])   # 25

Here:

  • "name" and "age" are keys
  • "Alice" and 25 are values

2️⃣ Why we need a dictionary in Two Sum

In the Two Sum problem:

  • We want to quickly check if we’ve already seen a number that can pair with the current number.
  • To do this efficiently, we use a dictionary (seen).

We store:

  • key = the number itself
  • value = the index where that number appears

3️⃣ Example walkthrough

nums = [2, 7, 11, 15]
target = 9
seen = {}
  • Step 1: Look at 2

    • Complement = 9 - 2 = 7
    • 7 is not in seen yet
    • Store 2:0seen = {2:0}
  • Step 2: Look at 7

    • Complement = 9 - 7 = 2
    • 2 is in seen → we found a pair!
    • Return [0,1]

4️⃣ Key idea

seen = {} is just making a blank notebook (dictionary).
As we loop, we write down numbers and their positions inside it, so we can look them up super fast later.


✅ So in plain words:
seen = {} creates an empty dictionary we’ll use to remember which numbers we’ve already checked and where they are.


Would you like me to also explain how seen[num] = i works in the loop? (That’s the step where we actually “write down” things into the dictionary.)


note2: seen[num] = i

Perfect 👍 Let’s now explain what this line does inside the loop:

seen[num] = i

1️⃣ What’s happening

  • seen is a dictionary (we made it with seen = {}).
  • num is the number from the list.
  • i is the index (position) of that number.

So seen[num] = i means:

👉 “Remember that this number (num) is at position i in the list.”


2️⃣ Example step by step

Let’s run through the example:

nums = [2, 7, 11, 15]
target = 9
seen = {}
  • Loop starts:

Step 1: i=0, num=2

  • seen[num] = iseen[2] = 0
  • Now seen = {2: 0}
    (means number 2 is at index 0)

Step 2: i=1, num=7

  • seen[num] = iseen[7] = 1
  • Now seen = {2: 0, 7: 1}
    (means number 2 is at index 0, number 7 is at index 1)

Step 3: i=2, num=11

  • seen[num] = iseen[11] = 2
  • Now seen = {2: 0, 7: 1, 11: 2}

Step 4: i=3, num=15

  • seen[num] = iseen[15] = 3
  • Now seen = {2: 0, 7: 1, 11: 2, 15: 3}

3️⃣ Why we do this

Later in the loop, before adding, we check:

complement = target - num
if complement in seen:
    return [seen[complement], i]
  • If the “partner number” we need is already stored in seen,
    → we just return its index from the dictionary (seen[complement]) and the current index (i).

4️⃣ Analogy

Imagine you are solving a puzzle:

  • You’re walking through numbers one by one.
  • You carry a notebook (seen).
  • For each number, you write:
    "Number X is at position Y".
  • When you find a new number, you quickly flip through your notebook to see if the “partner number” is already written.

That’s what seen[num] = i does — it writes the number and its position in your notebook.


Do you want me to run a full dry run of the whole code (loop + dictionary updates) for the input [2,7,11,15], target=9 so you see exactly when it finds the answer?


note3: explain clearly

Awesome 🚀 Let’s do a full dry run of the Two Sum code with

nums = [2, 7, 11, 15]
target = 9

🔹 The Code

def twoSum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], i]
        seen[num] = i

🔹 Step-by-step execution

Start:

  • nums = [2, 7, 11, 15]
  • target = 9
  • seen = {} (empty dictionary)

🔸 Loop 1: i = 0, num = 2

  • complement = 9 - 2 = 7
  • Is 7 in seen? → ❌ No
  • Store seen[2] = 0
  • Now seen = {2: 0}

🔸 Loop 2: i = 1, num = 7

  • complement = 9 - 7 = 2
  • Is 2 in seen? → ✅ Yes! (seen = {2: 0})
  • Return [seen[2], i][0, 1]

👉 Answer found: indices [0,1] because nums[0] + nums[1] = 2 + 7 = 9


🔸 Loop stops

The function returns immediately once it finds the pair.
So the later numbers 11 and 15 are never checked.


✅ Final Output

[0, 1]

🔑 Key Learning

  1. Dictionary seen is used to remember numbers and their positions.
  2. Before storing the current number, we check if its partner (complement) is already in seen.
  3. If yes → we found the solution instantly.

That’s why this algorithm is O(n): we only scan the list once.


note4: analog with orb slam3

Great question 🙌 Let’s carefully map LeetCode Two Sum to ORB-SLAM3 concepts.


🧩 Two Sum Recap

We want to find two indices i, j such that:

nums[i] + nums[j] = target

We use a hash map (seen) to remember numbers we’ve already checked, and for each new number we ask:

👉 “Is its complement already stored?”

If yes → we’ve found the pair.


🛰 ORB-SLAM3 Analogy

ORB-SLAM3 often needs to find matching pairs between features, descriptors, or keyframes.
Two Sum is like a simplified version of this fast pair matching.


🔹 Analogy Table

Two Sum ConceptORB-SLAM3 Equivalent
nums (array of numbers)Set of feature descriptors in an image
target (desired sum)Constraint (e.g., geometric consistency, loop closure score)
complement = target - numMatching feature needed to satisfy constraint
Dictionary seenVocabulary tree / inverted index (fast lookup of visual words)
if complement in seenIf another frame/keyframe already has this visual word
Return [i, j]Return pair of matched features / keyframes

🔹 Example Mapping in ORB-SLAM3

  1. Feature Matching (ORBmatcher.cc)

    • Two Sum: check if complement is in dictionary.
    • ORB-SLAM3: check if descriptor match exists between two frames (using Hamming distance).
  2. Loop Detection (KeyFrameDatabase.cc)

    • Two Sum: once we see a number, store it in seen.
    • ORB-SLAM3: once we see a visual word in a keyframe, store it in the inverted index.
    // pseudo
    visual_word_id -> {keyframe1, keyframe2, ...}
    

    This is just like seen[num] = i.

  3. Relocalization

    • Two Sum: given target, we look for a partner number already stored.
    • ORB-SLAM3: given a query frame, we look for partner keyframes that share enough visual words.

🔹 Why They’re Similar

  • Hash Map Idea:
    Both use hash-based structures (dict in Two Sum, inverted index in SLAM) to avoid slow O(n²) searching.
  • Complement Concept:
    Two Sum’s target - num ≈ SLAM’s “what feature/keyframe would make this match valid.”
  • Output:
    Two indices in Two Sum ≈ two feature IDs (or two keyframe IDs) in SLAM.

Summary:
LeetCode Two Sum trains you to think in terms of:

  • Storing what you’ve seen,
  • Looking up the “partner” quickly,
  • Returning the matching pair.

This is exactly how ORB-SLAM3 does fast feature matching and loop detection with its vocabulary tree + inverted index.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值