title: "Two Sum"
difficulty: "Easy"
tags: ["Array", "Hash Table"]
<style>
.ts2-wrap{
--bg: #FFFFFF;
--panel: #FFFFFF;
--panel-2: #FAFAFA;
--line: #E9E9EC;
--ink: #16171A;
--ink-dim: #83848A;
--accent: #5B4FE5;
--accent-soft: #F1F0FD;
--success: #1E9E6B;
--success-soft: #EEF9F4;
--amber: #C97F1E;
--mono: 'JetBrains Mono','Fira Code', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
--sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
font-family: var(--sans);
color: var(--ink);
background: var(--bg);
max-width: 840px;
margin: 0 auto;
padding: 40px 24px 80px;
line-height: 1.6;
}
.ts2-wrap *{box-sizing:border-box;}
.ts2-head-row{display:flex; align-items:center; gap:12px; flex-wrap:wrap;}
.ts2-wrap h1{font-size:28px; font-weight:750; letter-spacing:-0.01em; margin:0;}
.ts2-badge{
font-family:var(--mono); font-size:12px; font-weight:600; padding:4px 11px; border-radius:20px;
color:var(--success); background:var(--success-soft); border:1px solid rgba(30,158,107,0.2);
}
.ts2-tags{display:flex; gap:8px; margin-top:14px; flex-wrap:wrap;}
.ts2-tag{
display:inline-flex; align-items:center; gap:6px;
font-size:12.5px; font-weight:500; color:var(--ink-dim);
padding:5px 11px; border-radius:8px; background:var(--panel-2); border:1px solid var(--line);
}
.ts2-tag svg{width:13px; height:13px; flex-shrink:0;}
.ts2-divider{height:1px; background:var(--line); margin:28px 0;}
.ts2-statement{font-size:15.5px; color:var(--ink); max-width:680px;}
.ts2-statement code{
font-family:var(--mono); font-size:14px; background:var(--panel-2);
border:1px solid var(--line); padding:1px 6px; border-radius:5px; color:var(--accent);
}
.ts2-statement p{margin-bottom:14px;}
.ts2-statement em{font-style:italic;}
.ts2-sec-title{
font-size:15px; font-weight:700; margin:34px 0 14px;
display:flex; align-items:center; gap:8px;
}
.ts2-sec-title svg{width:16px; height:16px; color:var(--accent); flex-shrink:0;}
/* Autoplay example diagram */
.ts2-diagram{
border:1px solid var(--line); border-radius:14px; padding:30px 24px;
background:var(--panel-2); display:flex; flex-direction:column; align-items:center; gap:20px;
}
.ts2-diagram-caption{font-family:var(--mono); font-size:13px; color:var(--ink-dim);}
.ts2-diagram-caption b{color:var(--ink);}
.ts2-array-row{display:flex; gap:10px; position:relative; padding-top:20px;}
.ts2-cell{
width:56px; height:56px; border-radius:11px; border:1.5px solid var(--line);
display:flex; align-items:center; justify-content:center;
font-family:var(--mono); font-size:18px; font-weight:700; color:var(--ink);
background:#FFFFFF; position:relative; transition: all .5s cubic-bezier(.4,0,.2,1);
}
.ts2-cell .ts2-idx{position:absolute; bottom:-20px; font-size:10.5px; color:var(--ink-dim); font-weight:400; font-family:var(--mono);}
.ts2-pointer{
position:absolute; top:-4px; width:8px; height:8px; border-radius:50%; background:var(--accent);
animation: ts2Pointer 8s ease infinite;
}
.ts2-equation{
font-family:var(--mono); font-size:15px; color:var(--ink-dim); min-height:22px;
animation: ts2Fade3 8s ease infinite;
}
.ts2-equation .num{color:var(--success); font-weight:700;}
.ts2-equation .arrow{color:var(--ink-dim); margin:0 6px;}
.ts2-equation .out{color:var(--accent); font-weight:700;}
.ts2-caption-stack{position:relative; width:100%; max-width:440px; min-height:20px; text-align:center;}
.ts2-caption{
position:absolute; top:0; left:0; right:0;
font-size:13.5px; color:var(--ink-dim); opacity:0;
}
.ts2-caption .hl{color:var(--ink); font-weight:600;}
.ts2-caption .ok{color:var(--success); font-weight:700;}
.ts2-caption.cap1{animation: ts2Fade1 8s ease infinite;}
.ts2-caption.cap2{animation: ts2Fade2 8s ease infinite;}
.ts2-caption.cap3{animation: ts2Fade3 8s ease infinite;}
.ts2-cell.cell-a{animation: ts2CellA 8s ease infinite;}
.ts2-cell.cell-b{animation: ts2CellB 8s ease infinite;}
@keyframes ts2Pointer{
0% { left:24px; opacity:0; }
5% { left:24px; opacity:0; }
7% { left:24px; opacity:1; }
29% { left:24px; opacity:1; }
34% { left:90px; opacity:1; }
36% { left:90px; opacity:1; }
59% { left:90px; opacity:1; }
62% { left:90px; opacity:0; }
100% { left:90px; opacity:0; }
}
@keyframes ts2Fade1{
0%,5% { opacity:0; }
7%,27% { opacity:1; }
29%,100%{ opacity:0; }
}
@keyframes ts2Fade2{
0%,34% { opacity:0; }
36%,57% { opacity:1; }
59%,100%{ opacity:0; }
}
@keyframes ts2Fade3{
0%,64% { opacity:0; }
66%,92% { opacity:1; }
94%,100%{ opacity:0; }
}
@keyframes ts2CellA{
0%,4% { border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
6%,29% { border-color:var(--accent); background:#FFFFFF; box-shadow:0 0 0 3px var(--accent-soft); transform:translateY(-3px); }
32%,64% { border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
66%,94% { border-color:var(--success); background:var(--success-soft); box-shadow:0 0 0 3px rgba(30,158,107,0.14); transform:translateY(-3px); }
97%,100%{ border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
}
@keyframes ts2CellB{
0%,34% { border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
36%,59% { border-color:var(--accent); background:#FFFFFF; box-shadow:0 0 0 3px var(--accent-soft); transform:translateY(-3px); }
62%,64% { border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
66%,94% { border-color:var(--success); background:var(--success-soft); box-shadow:0 0 0 3px rgba(30,158,107,0.14); transform:translateY(-3px); }
97%,100%{ border-color:var(--line); background:#FFFFFF; box-shadow:none; transform:translateY(0); }
}
/* Examples */
.ts2-example{margin-bottom:16px;}
.ts2-example-label{font-size:13.5px; font-weight:700; margin-bottom:8px; color:var(--ink);}
.ts2-example-box{
background:var(--panel-2); border:1px solid var(--line); border-radius:10px;
padding:16px 18px; font-family:var(--mono); font-size:13.5px; color:var(--ink);
}
.ts2-example-box div{margin-bottom:4px;}
.ts2-example-box div:last-child{margin-bottom:0;}
.ts2-example-box .lbl{color:var(--ink-dim);}
/* Constraints */
.ts2-constraints{display:flex; flex-direction:column; gap:10px;}
.ts2-constraint-row{
display:grid; grid-template-columns:160px 1fr; gap:16px; align-items:center;
padding:12px 16px; border:1px solid var(--line); border-radius:10px; background:var(--panel-2);
}
.ts2-constraint-row .k{font-size:13.5px; font-weight:600; color:var(--ink);}
.ts2-constraint-row .v{font-family:var(--mono); font-size:13px; color:var(--ink-dim);}
.ts2-note{
display:flex; align-items:flex-start; gap:10px; margin-top:20px;
font-size:13.5px; color:var(--ink-dim); padding:14px 16px;
background:var(--accent-soft); border:1px solid rgba(91,79,229,0.15); border-radius:10px;
}
.ts2-note svg{width:15px; height:15px; color:var(--accent); flex-shrink:0; margin-top:1px;}
.ts2-note b{color:var(--ink);}
.ts2-companies{display:flex; gap:8px; flex-wrap:wrap; margin-top:14px;}
.ts2-company{
font-size:12.5px; color:var(--ink-dim); padding:5px 12px; border-radius:8px;
background:var(--panel-2); border:1px solid var(--line);
}
</style>
<div class="ts2-wrap">
<div class="ts2-head-row">
<h1>Two Sum</h1>
<span class="ts2-badge">Easy</span>
</div>
<div class="ts2-tags">
<span class="ts2-tag">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><rect x="3" y="3" width="7" height="7" rx="1.5"/><rect x="14" y="3" width="7" height="7" rx="1.5"/><rect x="3" y="14" width="7" height="7" rx="1.5"/><rect x="14" y="14" width="7" height="7" rx="1.5"/></svg>
Array
</span>
<span class="ts2-tag">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M4 6h16M4 12h16M4 18h10"/><circle cx="19" cy="18" r="2"/></svg>
Hash Table
</span>
</div>
<div class="ts2-divider"></div>
<div class="ts2-statement">
<p>Given an array of integers <code>nums</code> and an integer <code>target</code>, return indices of the two numbers such that they add up to <code>target</code>.</p>
<p>You may assume that each input would have <em>exactly one</em> solution, and you may not use the same element twice.</p>
<p>You can return the answer in any order.</p>
</div>
<div class="ts2-sec-title">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="9"/><path d="M12 8v4l3 2"/></svg>
Example Walkthrough
</div>
<div class="ts2-diagram">
<div class="ts2-diagram-caption">nums = <b>[2, 7, 11, 15]</b> · target = <b>9</b></div>
<div class="ts2-array-row">
<div class="ts2-cell cell-a">2<span class="ts2-idx">i=0</span></div>
<div class="ts2-cell cell-b">7<span class="ts2-idx">i=1</span></div>
<div class="ts2-cell">11<span class="ts2-idx">i=2</span></div>
<div class="ts2-cell">15<span class="ts2-idx">i=3</span></div>
<div class="ts2-pointer"></div>
</div>
<div class="ts2-caption-stack">
<div class="ts2-caption cap1">Start at index <span class="hl">0</span> — nums[0] = <span class="hl">2</span>.</div>
<div class="ts2-caption cap2">Move to index <span class="hl">1</span> — nums[1] = <span class="hl">7</span>. Together they make <span class="ok">9</span>, the target.</div>
<div class="ts2-caption cap3">That pair adds up to the target — <span class="ok">this is the answer.</span></div>
</div>
<div class="ts2-equation">
<span class="num">2</span> + <span class="num">7</span><span class="arrow">=</span><span class="out">9</span><span class="arrow">→</span> Output: <span class="out">[0, 1]</span>
</div>
</div>
<div class="ts2-sec-title">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18M8 4v16"/></svg>
Examples
</div>
<div class="ts2-example">
<div class="ts2-example-label">Example 1</div>
<div class="ts2-example-box">
<div><span class="lbl">Input:</span> nums = [2,7,11,15], target = 9</div>
<div><span class="lbl">Output:</span> [0,1]</div>
<div><span class="lbl">Explanation:</span> Because nums[0] + nums[1] == 9, we return [0, 1].</div>
</div>
</div>
<div class="ts2-example">
<div class="ts2-example-label">Example 2</div>
<div class="ts2-example-box">
<div><span class="lbl">Input:</span> nums = [3,2,4], target = 6</div>
<div><span class="lbl">Output:</span> [1,2]</div>
</div>
</div>
<div class="ts2-example">
<div class="ts2-example-label">Example 3</div>
<div class="ts2-example-box">
<div><span class="lbl">Input:</span> nums = [3,3], target = 6</div>
<div><span class="lbl">Output:</span> [0,1]</div>
</div>
</div>
<div class="ts2-sec-title">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M9 6h11M9 12h11M9 18h11"/><circle cx="4" cy="6" r="1.5" fill="currentColor" stroke="none"/><circle cx="4" cy="12" r="1.5" fill="currentColor" stroke="none"/><circle cx="4" cy="18" r="1.5" fill="currentColor" stroke="none"/></svg>
Constraints
</div>
<div class="ts2-constraints">
<div class="ts2-constraint-row"><div class="k">Array Length</div><div class="v">2 <= nums.length <= 10^4</div></div>
<div class="ts2-constraint-row"><div class="k">Element Value</div><div class="v">-10^9 <= nums[i] <= 10^9</div></div>
<div class="ts2-constraint-row"><div class="k">Target Value</div><div class="v">-10^9 <= target <= 10^9</div></div>
</div>
<div class="ts2-note">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg>
<div><b>Note:</b> Only one valid answer exists.</div>
</div>
<div class="ts2-companies">
<span class="ts2-company">Google</span>
<span class="ts2-company">Amazon</span>
<span class="ts2-company">Meta</span>
</div>
</div>CompaniesGoogleAmazonMeta