惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
D
Docker
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
H
Help Net Security
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
L
LangChain Blog
MongoDB | Blog
MongoDB | Blog
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
SegmentFault 最新的问题
博客园 - 司徒正美
C
Check Point Blog
B
Blog
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
F
Fortinet All Blogs
美团技术团队
D
DataBreaches.Net

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Why the Two‑Pointer Trick Saved My Interview (and How It ...
Timevolt · 2026-06-03 · via DEV Community

Timevolt

Why the Two‑Pointer Trick Saved My Interview (and How It Can Save Yours)

Quick context (why you're writing this)

I still remember the sweat dripping down my forehead during a phone screen for a mid‑level backend role. The interviewer tossed me a classic: “Given a sorted array, find two numbers that add up to a target.” I dove straight into a nested loop, felt the O(n²) alarm bells ringing, and started second‑guessing every line. After a painful minute of stumbling, I blurted out, “What if we just start from both ends and move inward?” The interviewer’s eyes lit up, I coded it on the spot, and we moved on. That moment taught me something simple yet powerful: sometimes the biggest gains come from not doing extra work.

If you’ve ever stared at an array problem and felt the urge to slap two loops together, you know the feeling. The two‑pointer pattern is the antidote—once you see why it works, it becomes a go‑to tool rather than a lucky guess.

The Insight

The core idea is stupidly simple: when the input has some order (usually sorted, or can be made sorted), you can decide deterministically whether moving the left pointer forward or the right pointer backward will bring you closer to a solution. You never need to revisit a pair you’ve already examined because the ordering guarantees that any skipped pair would be worse, not better.

Why does this give O(n) time? Each pointer moves at most n steps total—left only goes right, right only goes left. No nested sweeps, no backtracking. The work is linear because every iteration discards at least one impossible candidate for good.

It’s not magic; it’s exploiting monotonicity. If the sum is too small, increasing the left pointer (the smaller number) is the only way to raise it. If the sum is too big, decreasing the right pointer (the larger number) is the only way to lower it. Any other move would waste effort.

How (with code)

Let’s walk through two real‑world interview favorites that illustrate the pattern.

1. Two Sum in a Sorted Array

Problem: Given a sorted integer array nums and an integer target, return indices of the two numbers such that they add up to target. Assume exactly one solution exists.

Common mistake: Jumping straight to a hash map or a double loop. The hash map works but uses extra O(n) space; the double loop is O(n²) and feels clumsy in an interview.

Two‑pointer solution:

function twoSumSorted(nums, target) {
  let left = 0;
  let right = nums.length - 1;

  while (left < right) {
    const sum = nums[left] + nums[right];

    if (sum === target) {
      return [left, right]; // found it!
    }

    if (sum < target) {
      // need a bigger sum → move left forward
      left++;
    } else {
      // sum too big → move right backward
      right--;
    }
  }

  // According to the problem statement this line is never reached.
  return [-1, -1];
}

What to watch:

  • Forgetting the while (left < right) condition leads to an infinite loop or out‑of‑bounds access.
  • Moving both pointers on a match (e.g., left++; right--;) would skip potential other solutions if duplicates existed—though the prompt guarantees uniqueness, it’s a habit worth keeping.

Why it’s O(n): Each iteration increments left or decrements right. Together they can move at most n steps, so the loop runs ≤ n times.

2. Container With Most Water

Problem: You are given an array height where height[i] is the height of a vertical line at position i. Find two lines that together with the x‑axis form a container holding the most water.

Common mistake: Trying every pair (O(n²)) or pre‑computing max left/right arrays (which works but feels overkill). The brute force approach quickly times out on large inputs.

Two‑pointer solution:

function maxArea(height) {
  let left = 0;
  let right = height.length - 1;
  let max = 0;

  while (left < right) {
    const width = right - left;
    const containerHeight = Math.min(height[left], height[right]);
    const area = width * containerHeight;

    if (area > max) max = area;

    // Move the pointer at the shorter line hoping to find a taller one
    if (height[left] < height[right]) {
      left++;
    } else {
      right--;
    }
  }

  return max;
}

What to watch:

  • Mis‑calculating the width (right - left) as right - left + 1 gives off‑by‑one errors.
  • Moving the pointer with the larger height is a common slip; you actually want to move the shorter side because the area is limited by the shorter line, and only a taller line could possibly increase the area.

Why it’s O(n): Same reasoning—each pointer traverses the array once.

Why This Matters

The two‑pointer pattern isn’t just a interview trick; it shows up in real‑world code where you need to scan linear data structures efficiently—think sliding windows, merging sorted lists, or even processing streams where you can’t afford quadratic work. When you internalize the why—that ordering gives you a deterministic direction to shrink the search space—you stop memorizing recipes and start recognizing opportunities.

It also trains you to look for invariants. In both examples the invariant is simple: the current pair is the best you can get with the current left or right pointer; moving the opposite pointer can’t improve it unless you move the limiting side. Spotting that invariant is what lets you adapt the pattern to variations (e.g., three‑sum, subarray sums, or even string palindrome checks).

So next time you see a sorted array, a monotonic property, or any scenario where you can define a “too small / too big” condition, ask yourself: Can I move one pointer to fix the imbalance? If yes, you’ve likely just turned an O(n²) nightmare into an O(n) win.

Challenge

Try applying the two‑pointer idea to “Find the pair with sum closest to a target” in a sorted array. No hash maps, no nested loops—just two pointers and a running best difference. Drop your solution or thoughts in the comments; I’m curious to see how you tweak the condition.

Happy coding! 🚀