<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harry Alto</title>
    <description>The latest articles on DEV Community by Harry Alto (@harryalto).</description>
    <link>https://dev.to/harryalto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3352285%2F39f7face-c9d5-4bf8-a855-459c0db3b590.png</url>
      <title>DEV Community: Harry Alto</title>
      <link>https://dev.to/harryalto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harryalto"/>
    <language>en</language>
    <item>
      <title>📘 Subarray Concepts</title>
      <dc:creator>Harry Alto</dc:creator>
      <pubDate>Mon, 14 Jul 2025 04:56:31 +0000</pubDate>
      <link>https://dev.to/harryalto/subarray-concepts-58k6</link>
      <guid>https://dev.to/harryalto/subarray-concepts-58k6</guid>
      <description>&lt;h1&gt;
  
  
  Notes &amp;amp; Intuition (with Examples)
&lt;/h1&gt;

&lt;p&gt;These notes summarize key concepts from a class on &lt;strong&gt;subarrays&lt;/strong&gt;, including brute-force techniques, prefix sum, and carry-forward approaches.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is a Subarray?
&lt;/h2&gt;

&lt;p&gt;A subarray is a &lt;strong&gt;contiguous part&lt;/strong&gt; of an array.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Given &lt;code&gt;A = [5, 6, 2, 8]&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-element subarrays: &lt;code&gt;[5]&lt;/code&gt;, &lt;code&gt;[6]&lt;/code&gt;, &lt;code&gt;[2]&lt;/code&gt;, &lt;code&gt;[8]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Multi-element subarrays: &lt;code&gt;[5, 6]&lt;/code&gt;, &lt;code&gt;[6, 2]&lt;/code&gt;, &lt;code&gt;[2, 8]&lt;/code&gt;, &lt;code&gt;[5, 6, 2]&lt;/code&gt;, &lt;code&gt;[6, 2, 8]&lt;/code&gt;, &lt;code&gt;[5, 6, 2, 8]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ The &lt;strong&gt;entire array&lt;/strong&gt; and &lt;strong&gt;individual elements&lt;/strong&gt; are subarrays.&lt;br&gt;&lt;br&gt;
✅ An &lt;strong&gt;empty array&lt;/strong&gt; is also a valid subarray.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧮 Basic Subarray Metadata
&lt;/h2&gt;

&lt;p&gt;To define a subarray:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start index&lt;/strong&gt; &lt;code&gt;s&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End index&lt;/strong&gt; &lt;code&gt;e&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
Given &lt;code&gt;A = [3, 4, 6, 2, 8, 10]&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Indexes: &lt;code&gt;[0, 1, 2, 3, 4, 5]&lt;/code&gt;&lt;br&gt;&lt;br&gt;
A subarray from index 2 to 4 is: &lt;code&gt;A[2:5] = [6, 2, 8]&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔢 Total Number of Subarrays
&lt;/h2&gt;

&lt;p&gt;For an array of length &lt;code&gt;N = 4&lt;/code&gt;:&lt;br&gt;&lt;br&gt;
&lt;code&gt;A = [1, 2, 3, 4]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Subarrays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting at index 0: &lt;code&gt;[1]&lt;/code&gt;, &lt;code&gt;[1,2]&lt;/code&gt;, &lt;code&gt;[1,2,3]&lt;/code&gt;, &lt;code&gt;[1,2,3,4]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Starting at index 1: &lt;code&gt;[2]&lt;/code&gt;, &lt;code&gt;[2,3]&lt;/code&gt;, &lt;code&gt;[2,3,4]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Starting at index 2: &lt;code&gt;[3]&lt;/code&gt;, &lt;code&gt;[3,4]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Starting at index 3: &lt;code&gt;[4]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total = 10 = &lt;code&gt;N * (N + 1) / 2&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Printing All Subarrays
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Print all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[3]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[3, 1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[3, 1, 6]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[1, 6]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[6]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📌 Printing Sum of a Given Subarray [s, e]
&lt;/h2&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="c1"&gt;# arr[1:4] = [4, 6, 2] → sum = 12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Prefix Sum Technique (for fast sum queries)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sum of subarray &lt;code&gt;[1,3]&lt;/code&gt;:
&lt;code&gt;prefix[3] - prefix[0] = 15 - 3 = 12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Carry-Forward Technique
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running subarray sums starting from index 2 (&lt;code&gt;value = 2&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[2]&lt;/code&gt; → 2&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[2,1]&lt;/code&gt; → 3&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[2,1,6]&lt;/code&gt; → 9&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[2,1,6,2]&lt;/code&gt; → 11&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Global Sum of All Subarray Sums (with Carry Forward)
&lt;/h2&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;Subarrays&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;their&lt;/span&gt; &lt;span class="n"&gt;sums&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧮 Subarrays Containing a Given Element
&lt;/h2&gt;

&lt;p&gt;Given &lt;code&gt;A = [7, 3, 2, 1, 6, 2]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;A[2] = 2&lt;/code&gt; (index 2):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can start at any index from 0 to 2 (3 options)&lt;/li&gt;
&lt;li&gt;It can end at any index from 2 to 5 (4 options)&lt;/li&gt;
&lt;li&gt;So &lt;code&gt;2&lt;/code&gt; is part of &lt;code&gt;3 × 4 = 12&lt;/code&gt; subarrays&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Total Contribution of Each Element to All Subarray Sums
&lt;/h2&gt;

&lt;p&gt;Given:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;Subarray&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;appears&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;subarrays&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;appears&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;subarrays&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;appears&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;subarrays&lt;/span&gt;

&lt;span class="n"&gt;So&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Matches total from carry-forward method.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Final Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Time Complexity&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Print all subarrays&lt;/td&gt;
&lt;td&gt;2 loops&lt;/td&gt;
&lt;td&gt;O(N²)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[1,2]&lt;/code&gt;, &lt;code&gt;[2,3]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subarray sum from s to e&lt;/td&gt;
&lt;td&gt;Prefix sum&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prefix[e] - prefix[s-1]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sum of all subarrays&lt;/td&gt;
&lt;td&gt;Carry forward&lt;/td&gt;
&lt;td&gt;O(N²)&lt;/td&gt;
&lt;td&gt;Nested sum accumulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sum of all subarrays (optimized)&lt;/td&gt;
&lt;td&gt;Element contribution&lt;/td&gt;
&lt;td&gt;O(N)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(i+1)*(N-i)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Count of subarrays including A[i]&lt;/td&gt;
&lt;td&gt;Formula-based&lt;/td&gt;
&lt;td&gt;O(1) per index&lt;/td&gt;
&lt;td&gt;A[2] in 12 subarrays&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Use prefix sums when querying random subarray sums.&lt;br&gt;&lt;br&gt;
Use carry-forward when computing totals in sequence.&lt;br&gt;&lt;br&gt;
Use contribution formula for fast aggregation over all subarrays.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Solving Leetcode Problem of Finding Pivot Index</title>
      <dc:creator>Harry Alto</dc:creator>
      <pubDate>Mon, 14 Jul 2025 04:29:42 +0000</pubDate>
      <link>https://dev.to/harryalto/solving-leetcode-problem-of-finding-pivot-index-3o5o</link>
      <guid>https://dev.to/harryalto/solving-leetcode-problem-of-finding-pivot-index-3o5o</guid>
      <description>&lt;h2&gt;
  
  
  🧠 Understanding the Pivot Index
&lt;/h2&gt;

&lt;p&gt;When given an array of integers, can we find an index where the &lt;strong&gt;sum of all elements to its left&lt;/strong&gt; equals the &lt;strong&gt;sum of all elements to its right&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;That index is called the &lt;strong&gt;pivot index&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The link to the leetcode problem is here for reference: &lt;a&gt;Leetcode 724&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 Problem Statement
&lt;/h2&gt;

&lt;p&gt;You're given a list of integers &lt;code&gt;nums&lt;/code&gt;. Find the &lt;strong&gt;pivot index&lt;/strong&gt; where:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sum(nums[0:i]) == sum(nums[i+1:])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Return that index, or &lt;code&gt;-1&lt;/code&gt; if no such index exists.&lt;/p&gt;




&lt;p&gt;There are three ways to solve the problem&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 Approach 1: Brute Force (O(n²))
&lt;/h2&gt;

&lt;p&gt;In this simple approach, we loop through the array and compute the sum of elements on both sides of every index.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Logic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pivot_index_brute_force&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;left_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;right_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;left_sum&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;right_sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚠️ Downside
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Repeated summing → O(n²) time&lt;/li&gt;
&lt;li&gt;Works, but not scalable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧮 Approach 2: Prefix and Suffix Arrays (O(n) Time, O(n) Space)
&lt;/h2&gt;

&lt;p&gt;Let’s optimize it by &lt;strong&gt;precomputing prefix and suffix sums&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;prefix[i]&lt;/code&gt;: sum of elements before &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;suffix[i]&lt;/code&gt;: sum of elements after &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We then find the index where &lt;code&gt;prefix[i] == suffix[i]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Logic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pivot_index_prefix_suffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
    &lt;span class="n"&gt;suffix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧠 Intuition
&lt;/h3&gt;

&lt;p&gt;We calculate the cumulative sum from the &lt;strong&gt;start to each index&lt;/strong&gt; (prefix) and from the &lt;strong&gt;end to each index&lt;/strong&gt; (suffix).&lt;br&gt;&lt;br&gt;
At each index &lt;code&gt;i&lt;/code&gt;, if the sum of elements &lt;strong&gt;before&lt;/strong&gt; it (&lt;code&gt;prefix[i]&lt;/code&gt;) equals the sum of elements &lt;strong&gt;after&lt;/strong&gt; it (&lt;code&gt;suffix[i]&lt;/code&gt;), then that index is the pivot.&lt;/p&gt;

&lt;p&gt;This avoids recalculating sums on every iteration and gives an efficient solution using two passes.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Approach 3: Optimized Mathematical Trick (O(n) Time, O(1) Space)
&lt;/h2&gt;

&lt;p&gt;Here’s where the real magic happens! Let’s derive the core insight.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 Intuition
&lt;/h3&gt;

&lt;p&gt;We know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;left_sum + nums[i] + right_sum = total_sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since &lt;code&gt;left_sum == right_sum&lt;/code&gt;, we substitute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 * left_sum + nums[i] = total_sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So our pivot condition becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;running_sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;total_sum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;running_sum&lt;/code&gt; is the sum to the left of index &lt;code&gt;i&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Logic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pivot_index_optimized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;running_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;running_sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;total_sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
        &lt;span class="n"&gt;running_sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Example Walkthrough
&lt;/h2&gt;

&lt;p&gt;Input: &lt;code&gt;nums = [1, 7, 3, 6, 5, 6]&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;Left Sum&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Right Sum&lt;/th&gt;
&lt;th&gt;2×Left + Val&lt;/th&gt;
&lt;th&gt;Equals total?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;✅ 28 = 28&lt;/td&gt;
&lt;td&gt;✅ Pivot found&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Time Complexity&lt;/th&gt;
&lt;th&gt;Space Complexity&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brute Force&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;Simple but inefficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefix &amp;amp; Suffix Arrays&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;Fast, uses extra memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimized Math&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;Fastest and cleanest ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔚 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This is a classic case of turning a brute-force problem into an elegant, math-powered solution. It's not just about speed — it's about &lt;strong&gt;understanding the data flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;➡ Know the definition&lt;br&gt;&lt;br&gt;
➡ Translate into equations&lt;br&gt;&lt;br&gt;
➡ Optimize with insight&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
