<?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: Rohith V</title>
    <description>The latest articles on DEV Community by Rohith V (@rohithv07).</description>
    <link>https://dev.to/rohithv07</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%2F480052%2Ff684c523-5316-4ac8-a73e-376d992dbcd4.jpeg</url>
      <title>DEV Community: Rohith V</title>
      <link>https://dev.to/rohithv07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohithv07"/>
    <language>en</language>
    <item>
      <title>Track My Cash: Building a Secure, Decoupled Ledger with Spring Boot, Vanilla JS, and Gemini</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 28 Feb 2026 12:55:41 +0000</pubDate>
      <link>https://dev.to/rohithv07/track-my-cash-building-a-secure-decoupled-ledger-with-spring-boot-vanilla-js-and-gemini-2d79</link>
      <guid>https://dev.to/rohithv07/track-my-cash-building-a-secure-decoupled-ledger-with-spring-boot-vanilla-js-and-gemini-2d79</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reusing the side project that I had worked on recently for this Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;BookKeeping&lt;/strong&gt;, a full-stack financial ledger application designed to solve a very specific problem: keeping track of money I lend to friends without needing a bloated, complex accounting tool.&lt;/p&gt;

&lt;p&gt;The application is a stateless, decoupled Single Page Application (SPA). The frontend is built entirely in Vanilla JavaScript, HTML, and CSS (zero framework dependencies!) and now deployed securely on Google Cloud Run. It communicates with a robust backend powered by Java, Spring Boot 3, Spring Security 6, and a PostgreSQL database hosted on Render.&lt;/p&gt;

&lt;p&gt;Google Gemini was my pair-programming partner throughout the entire development cycle. Gemini played a massive role in helping me stitch together the tricky parts of a decoupled architecture. Specifically, we used Gemini to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architect the Security Flow&lt;/strong&gt;: It helped me implement stateless JWT authentication using HttpOnly cookies and standard Bearer tokens.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Handle Browser Security Hurdles&lt;/strong&gt;: Gemini and I worked through aggressive third-party cookie blocking (like Safari ITP) by engineering a strict CORS and JSON-payload strategy to neutralise CSRF attacks natively.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the Math Engine&lt;/strong&gt;: We built a custom "Partial Repayment" algorithm together that dynamically decreases loan amounts and automatically triggers database row deletion when a balance hits zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Construct Cloud Run Docker Environments&lt;/strong&gt;: When migrating the frontend to Google Cloud Run, we built a lean Alpine Nginx container. Gemini instantly flagged that Cloud Run overrides standard port bindings—so we implemented a dynamic &lt;code&gt;nginx.conf.template&lt;/code&gt; that natively injects Cloud Run's &lt;code&gt;$PORT&lt;/code&gt; environment variable during deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design Native Operating System Localisation&lt;/strong&gt;: During my Multi-Currency expansion logic, my browser stubbornly refused to format Euros properly. Gemini analysed the frontend code and detected a hardcoded &lt;code&gt;'en-US'&lt;/code&gt; locale string overriding the dynamic ISO codes. By removing the strict binding and passing &lt;code&gt;undefined&lt;/code&gt; into the JavaScript &lt;code&gt;Intl.NumberFormat&lt;/code&gt; API, my interface immediately inherited my computer's dynamic OS localisation formatting.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note on Authentication&lt;/strong&gt;: You might notice the login system is intentionally very straightforward. Since this application is built to solve a highly focused, personal task (tracking our own money), a complex OAuth or multi-role hierarchy wasn't necessary. The simple stateless JWT login keeps the app lightweight and entirely under control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Github Link : &lt;a href="https://rohithv07.github.io/BookKeeping/" rel="noopener noreferrer"&gt;https://rohithv07.github.io/BookKeeping/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cloud Run URL Embedded :&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://bookkeeping-825356176757.europe-west1.run.app/"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Rohithv07" rel="noopener noreferrer"&gt;
        Rohithv07
      &lt;/a&gt; / &lt;a href="https://github.com/Rohithv07/BookKeeping" rel="noopener noreferrer"&gt;
        BookKeeping
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Record the debts that we are lending to other people.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;BookKeeping&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Record the debts that we are lending to other people.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What was implemented&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot App&lt;/strong&gt;: A robust REST API running on Java 21, built using Gradle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Models&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Borrower&lt;/code&gt;: Saves name, email, and phone.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Loan&lt;/code&gt;: Tracks amount, date lent, exact 1-month (&lt;code&gt;dueDate&lt;/code&gt;), and loan status (&lt;code&gt;ACTIVE&lt;/code&gt; vs &lt;code&gt;REPAID&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core API Endpoints&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/borrowers&lt;/code&gt; and &lt;code&gt;GET /api/borrowers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/loans&lt;/code&gt; and &lt;code&gt;GET /api/loans&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT /api/loans/{id}/repay&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification Job&lt;/strong&gt;: The &lt;code&gt;NotificationService&lt;/code&gt; is scheduled to run every day at 8:00 AM. It queries the database for any active loans where the due date is today or earlier and dispatches an email exclusively to your personal Gmail account (as requested).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Architecture Upgrades&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interface-Driven Design&lt;/strong&gt;: The Service layer employs interface contracts (&lt;code&gt;BorrowerService&lt;/code&gt;, &lt;code&gt;LoanService&lt;/code&gt;) for loose coupling and scalability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Transfer Objects (DTOs)&lt;/strong&gt;: API payloads exclusively use &lt;code&gt;BorrowerDto&lt;/code&gt; and…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Rohithv07/BookKeeping" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Building this application taught me that security and distributed environments are not magic.&lt;/p&gt;

&lt;p&gt;When you separate your frontend (Google Cloud Run) from your backend (Render), security suddenly becomes your biggest technical hurdle. Attempting to pass cookies across domains taught me deep, unexpected lessons about modern browser architecture, Preflight OPTIONS requests, and why major browsers actually intercept cross-domain cookies to protect privacy.&lt;/p&gt;

&lt;p&gt;Additionally, I learned incredibly valuable lessons about Multi-Tenancy database migrations. When I upgraded the application to securely map existing financial records to authenticated user profiles, all of my old data completely "vanished"! By collaborating with Gemini, we built an automated &lt;code&gt;DataMigrationRunner&lt;/code&gt; in Java that essentially scanned the PostgreSQL database for legacy, orphaned data during startup and flawlessly bound those records back to my isolated user profile using newly minted foreign keys. &lt;/p&gt;

&lt;p&gt;Working with Gemini also taught me the value of interactive debugging. Instead of endlessly combing through StackOverflow threads when my frontend deployment returned an obscure &lt;code&gt;gcloud run deploy&lt;/code&gt; port binding error, I could simply paste the logs directly to Gemini. It structurally unpacked how Nginx Alpine images process templates and provided the exact variable substitution fix instantaneously. &lt;/p&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What worked well&lt;/strong&gt;: Gemini is incredibly strong at context retention across complex files. When I needed to refactor my Spring Security &lt;code&gt;JwtAuthenticationFilter&lt;/code&gt; to accept both cookies and Bearer tokens, Gemini didn't just give me a generic code snippet; it understood the exact architecture of my Java files and provided surgical, drop-in code replacements. The same deep architectural awareness proved vital during our PostgreSQL schema migrations and Cloud Run Nginx optimisations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I ran into friction&lt;/strong&gt;: There were a few moments where Gemini would try to eagerly fix a bug before I had finished explaining the complete symptom. For example, when my frontend JavaScript was misfiring an onclick event, it occasionally suggested backend fixes before realising the bug was actually a simple string interpolation error in my Vanilla JS HTML template. Once we clarified the scope, however, the eventual fix was spot on. Additionally, I experienced a recurring loop where the agent would continuously execute superficial internal baseline scripts (like &lt;code&gt;echo "do something"&lt;/code&gt;) just to bypass strict system task-boundary protocols before finally delivering a direct chat response to my question!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building a Full-Stack Bookkeeping Ledger Using Antigravity</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Mon, 23 Feb 2026 13:29:48 +0000</pubDate>
      <link>https://dev.to/rohithv07/building-a-full-stack-bookkeeping-ledger-using-antigravity-fd0</link>
      <guid>https://dev.to/rohithv07/building-a-full-stack-bookkeeping-ledger-using-antigravity-fd0</guid>
      <description>&lt;p&gt;I recently built a full-stack bookkeeping application to help track borrowed money and loan repayments. My goal for this side project was to build a secure, practical tool from scratch while gaining hands-on experience with modern, decoupled application architecture. I usually lend money, and most of the time, I get lost in tracking the records.&lt;/p&gt;

&lt;p&gt;Since we have modern AI agents and tools, I use Google Antigravity IDE, where my primary focus was to provide the requirements, review the plan put forward by Antigravity, review the code, and provide suggestions.&lt;/p&gt;

&lt;p&gt;Here is an overview of the project, the tech stack I used, and some of the technical challenges I solved along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;I chose to separate the frontend from the backend to mirror how production applications are often built. The project is hosted entirely on cloud-free tiers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: Java, Spring Boot 3, Spring Data JPA&lt;/li&gt;
&lt;li&gt;Database: PostgreSQL (hosted on Neon.tech)&lt;/li&gt;
&lt;li&gt;Frontend: Vanilla JavaScript, HTML, and CSS&lt;/li&gt;
&lt;li&gt;Security: Spring Security 6 with stateless JWTs&lt;/li&gt;
&lt;li&gt;Deployment: Render (Backend), GitHub Pages (Frontend), with GitHub 
Actions for CI/CD&lt;/li&gt;
&lt;li&gt;IDE: Google Antigravity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Core Features
&lt;/h2&gt;

&lt;p&gt;The application handles standard CRUD operations for managing borrowers and tracking active loans. However, I focused heavily on building out two specific areas: security and realistic repayment logic.&lt;/p&gt;

&lt;p&gt;1.Partial Repayment Logic&lt;br&gt;
Instead of just marking a loan as "paid" or "unpaid", I implemented an endpoint that allows for partial repayments.&lt;/p&gt;

&lt;p&gt;When a user submits a repayment amount, the Spring Boot backend processes the math. If the remaining balance drops to zero or below, the program automatically deletes the loan record from the PostgreSQL database. If there is still a remaining balance, it securely updates the active record.&lt;/p&gt;

&lt;p&gt;2.Stateless Security and JWTs&lt;br&gt;
To secure the API, I implemented stateless authentication using JSON Web Tokens (JWT). Instead of storing the token in local storage, where it might be exposed to XSS attacks, the backend packages it in an HttpOnly cookie.&lt;/p&gt;

&lt;p&gt;3.Handling Cross-Origin Requests&lt;br&gt;
One of the main challenges of deploying a decoupled app is dealing with browser security policies. Because the frontend is hosted on GitHub Pages and the backend is on Render, the domains do not match.&lt;/p&gt;

&lt;p&gt;By configuring the server only to accept JSON payloads and explicitly whitelisting the GitHub Pages domain, the browser's native preflight OPTIONS requests successfully neutralize CSRF threats without relying on third-party cookies.&lt;/p&gt;

&lt;p&gt;4.Brute-Force Protection&lt;br&gt;
To protect the database from automated login attacks, I integrated Bucket4j into the authentication flow. This acts as an API rate limiter, restricting users to a maximum of 5 login attempts per minute before temporarily blocking their IP.&lt;/p&gt;
&lt;h2&gt;
  
  
  Repository and Deployment
&lt;/h2&gt;

&lt;p&gt;To ensure the project remains stable, I set up a GitHub Actions pipeline that automatically runs my JUnit and Mockito integration tests on every push.&lt;/p&gt;

&lt;p&gt;You can view the source code and the live deployment here:&lt;/p&gt;

&lt;p&gt;GitHub Repository: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Rohithv07" rel="noopener noreferrer"&gt;
        Rohithv07
      &lt;/a&gt; / &lt;a href="https://github.com/Rohithv07/BookKeeping" rel="noopener noreferrer"&gt;
        BookKeeping
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Record the debts that we are lending to other people.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;BookKeeping&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Record the debts that we are lending to other people.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What was implemented&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot App&lt;/strong&gt;: A robust REST API running on Java 21, built using Gradle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Models&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Borrower&lt;/code&gt;: Saves name, email, and phone.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Loan&lt;/code&gt;: Tracks amount, date lent, exact 1-month (&lt;code&gt;dueDate&lt;/code&gt;), and loan status (&lt;code&gt;ACTIVE&lt;/code&gt; vs &lt;code&gt;REPAID&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core API Endpoints&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/borrowers&lt;/code&gt; and &lt;code&gt;GET /api/borrowers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/loans&lt;/code&gt; and &lt;code&gt;GET /api/loans&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT /api/loans/{id}/repay&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification Job&lt;/strong&gt;: The &lt;code&gt;NotificationService&lt;/code&gt; is scheduled to run every day at 8:00 AM. It queries the database for any active loans where the due date is today or earlier and dispatches an email exclusively to your personal Gmail account (as requested).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Architecture Upgrades&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interface-Driven Design&lt;/strong&gt;: The Service layer employs interface contracts (&lt;code&gt;BorrowerService&lt;/code&gt;, &lt;code&gt;LoanService&lt;/code&gt;) for loose coupling and scalability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Transfer Objects (DTOs)&lt;/strong&gt;: API payloads exclusively use &lt;code&gt;BorrowerDto&lt;/code&gt; and…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Rohithv07/BookKeeping" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Live Application: &lt;a href="https://rohithv07.github.io/BookKeeping/" rel="noopener noreferrer"&gt;https://rohithv07.github.io/BookKeeping/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note that the app will be slow as all the deployments are with limited resources and a free tier.&lt;/p&gt;

</description>
      <category>java</category>
      <category>javascript</category>
      <category>gemini</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Minimalism Defying Gravity: My Entry for the Google AI Portfolio Challenge 🚀</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 17 Jan 2026 16:38:04 +0000</pubDate>
      <link>https://dev.to/rohithv07/minimalism-defying-gravity-my-entry-for-the-google-ai-portfolio-challenge-1i6l</link>
      <guid>https://dev.to/rohithv07/minimalism-defying-gravity-my-entry-for-the-google-ai-portfolio-challenge-1i6l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Senior Application Engineer @ Oracle | Java &amp;amp; Spring Boot Enthusiast
&lt;/h3&gt;

&lt;p&gt;I am a Senior Application Engineer at Oracle with over 4 years of experience building scalable enterprise solutions and optimizing UI performance for thousands of customers. My work ranges from architecting Agentic AI tools to leading complex cloud migrations.&lt;/p&gt;

&lt;p&gt;Beyond the corporate world, I am passionate about competitive programming and data structures. I love breaking down complex algorithmic challenges and sharing my learnings with the community. You might have seen my articles on Dev.to and Medium, where I help over 1,200 followers master Java and problem-solving.&lt;/p&gt;

&lt;p&gt;Tech Stack: Java, Spring Boot, JavaScript, SQL Writing about: Data Structures, Algorithms, and System Design&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;


&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://tryouts-825356176757.europe-west1.run.app"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Portfolio Minimal
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Minimal, Fresh, and Clean&lt;/strong&gt; personal portfolio website built with React, Vite, Tailwind CSS, and Antigravity. It features a dual-interface design: a stunning standard scroll view and a geeky &lt;strong&gt;Terminal Mode&lt;/strong&gt; for CLI enthusiasts.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Dual View Modes&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Standard&lt;/strong&gt;: Clean typography, smooth scrolling, and responsive layout.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Terminal Mode&lt;/strong&gt;: A simulated MacBook terminal environment. Type commands like &lt;code&gt;/experience&lt;/code&gt; or &lt;code&gt;/help&lt;/code&gt; to navigate.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Smart Navigation&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;ChatBot&lt;/strong&gt;: An AI-style assistant that scrolls you to sections (e.g., "Show me your skills").&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Smooth Scroll&lt;/strong&gt;: Polished scroll interactions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Theming&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Dark/Light Toggle&lt;/strong&gt;: Seamless switching between light (fresh) and dark (sleek) themes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Modern Tech Stack&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;React + Vite&lt;/strong&gt;: Chosen for lightning-fast HMR and component-based architecture.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tailwind CSS&lt;/strong&gt;: Utility-first styling for consistent design tokens and dark mode support.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Framer Motion&lt;/strong&gt;: Smooth, spring-physics based animations for entrance effects and interactions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Lucide React&lt;/strong&gt;: Clean, lightweight SVG icons that match the minimal aesthetic.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  ? Design Philosophy
&lt;/h3&gt;

&lt;p&gt;The goal was to build a portfolio that stands out by doing &lt;em&gt;less&lt;/em&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Minimalism&lt;/strong&gt;: We stripped away heavy backgrounds and complex layouts in favor of whitespace, typography, and content.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Freshness&lt;/strong&gt;: The "Standard" view is designed to feel like a breath of fresh air—smooth scrolling, pill-shaped interactions, and subtle motion.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Geek Mode&lt;/strong&gt;: For the developers and CLI lovers, we included a &lt;strong&gt;Terminal Mode&lt;/strong&gt; and &lt;strong&gt;ChatBot&lt;/strong&gt;. It's a nod to our roots—sometimes the command line is just faster (and cooler) than a GUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ? Layout &amp;amp; Sections
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hero&lt;/strong&gt;: Minimal introduction with resume download and social links.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Experience&lt;/strong&gt;: Time-line style work history.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Highlights&lt;/strong&gt;: "Most Proud Of" section with card layouts.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Skills&lt;/strong&gt;: Technical stack showcase.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  -   &lt;strong&gt;Contact&lt;/strong&gt;: Pill-shaped interactive contact links.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ? Getting Started
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Node.js (v14 or higher)&lt;/li&gt;
&lt;li&gt;  npm or yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1. Fork &amp;amp; Clone
&lt;/h4&gt;

&lt;p&gt;To make this project your own, fork the repository to your GitHub account:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Click the &lt;strong&gt;Fork&lt;/strong&gt; button at the top right of this page.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clone your forked repository:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/YOUR_USERNAME/portfolio-minimal.git
&lt;span class="nb"&gt;cd &lt;/span&gt;portfolio-minimal
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  2. Install Dependencies
&lt;/h4&gt;

&lt;p&gt;Install the required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Run Locally
&lt;/h4&gt;

&lt;p&gt;Start the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt; (or the port shown in your terminal) to view it in the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Build for Production
&lt;/h3&gt;

&lt;p&gt;To create an optimized build for deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ? Terminal Commands (MacBook View)
&lt;/h3&gt;

&lt;p&gt;Switch to Terminal Mode by clicking the &lt;strong&gt;Laptop Icon&lt;/strong&gt; in the navbar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;/help&lt;/code&gt; - List all commands&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/experience&lt;/code&gt; - View work history&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/skill&lt;/code&gt; - List technical skills&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/proud&lt;/code&gt; - View highlights&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;/contact&lt;/code&gt; - Show contact info&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;exit&lt;/code&gt; - Return to standard view
### ? License
Distribute freely. Credit is appreciated! MIT License.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhldl2yi4p8fixe1fzrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhldl2yi4p8fixe1fzrz.png" alt="Confused meme" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
Building the portfolio was one thing; deploying it was an entirely different beast. My goal was ambitious: a single codebase deployed simultaneously to GitHub Pages (for visibility) and Google Cloud Run (for the challenge).&lt;/p&gt;

&lt;p&gt;Here is the breakdown of how everything broke, and the specific engineering decisions I made to fix it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Authentication Wall&lt;br&gt;
&lt;strong&gt;The Error&lt;/strong&gt;: &lt;code&gt;Error: Key is already in use&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;What broke&lt;/strong&gt;: I was confident I had SSH keys set up, but when I tried to add my existing key to my GitHub account, I hit a brick wall. It turned out the key on my machine was already linked to an old, forgotten GitHub account. Since GitHub treats SSH keys as unique fingerprints, it wouldn't allow me to reuse the same key for my new identity. The Fix: instead of trying to recover the old account, I generated a brand new Ed25519 key specifically for this profile. I then configured my local SSH agent to recognize this new identity, effectively separating my past "ghost" account from my current work. The Lesson: In the world of git, keys are strict identities, not just reusable passwords. You can't be two people at once with the same fingerprint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "Missing" Homepage&lt;br&gt;
The Error: My live site rendered my README.md instead of my React app. What broke: My project wasn't at the root of the repository; it was nested inside a /portfolio-minimal folder. GitHub Pages defaults to serving the root directory. The Fix: I moved away from the standard "Deploy from Branch" method and wrote a custom GitHub Actions workflow. I configured the upload-pages-artifact step to target my specific subdirectory (path: './portfolio-minimal'), essentially telling the build server exactly where to look.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "Raw Code" Trap&lt;br&gt;
The Error: 404 Not Found: /src/main.jsx What broke: Once the folder was found, the browser tried to load my source code directly. Browsers can't read React (.jsx) or TypeScript; they need standard JavaScript. The Fix: I updated my CI/CD pipeline to include a Build Step. I added a job to install Node.js dependencies and run npm run build inside the action. This compiled my raw React code into a static dist folder, which is what actually gets shipped to the user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Path Mismatch (The 404 Nightmare)&lt;br&gt;
The Error: The site loaded, but was a blank white screen. The console screamed 404 for every CSS and JS asset. What broke: My repository name was Tryouts, so GitHub hosted the site at username.github.io/Tryouts/. However, Vite (my bundler) assumed the site was at the root (/), so it looked for assets in the wrong place. The Fix: I reconfigured vite.config.js to set the base path to /Tryouts/. This aligned my asset requests with the actual URL structure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Cloud Build Context&lt;br&gt;
The Error: Dockerfile: no such file or directory What broke: Moving to Google Cloud Run, the build failed immediately. The Cloud Build trigger runs from the repository root, but my Dockerfile was hidden inside the subdirectory. The Fix: I modified the cloudbuild.yaml to include dir: portfolio-minimal in the build step. This forced the builder to "change directory" into my project folder before attempting to read the Docker instructions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Port Collision&lt;br&gt;
The Error: The user-provided container failed to start... PORT=8080 What broke: Cloud Run acts as a reverse proxy sending traffic to port 8080. My Nginx container was listening on the standard web port 80. The signals were crossing, and the container crashed. The Fix: I updated my Nginx configuration (nginx.conf) and Dockerfile to explicitly listen and EXPOSE port 8080, aligning my container's internal networking with Google's infrastructure requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Dual-Environment Dilemma (The Final Boss)&lt;br&gt;
The Error: Fixing the path for GitHub Pages (/Tryouts/) broke the site on Cloud Run (which runs at the root /). I couldn't have hardcoded paths for both. What broke: One static configuration cannot serve two different deployment environments. The Fix: I implemented conditional logic in my build process.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In vite.config.js, I added a check for an environment variable called BASE_PATH.&lt;/p&gt;

&lt;p&gt;In my Dockerfile, I injected ENV BASE_PATH=/.&lt;/p&gt;

&lt;p&gt;Result: When building for GitHub, it defaults to /Tryouts/. When building for Docker/Cloud Run, it dynamically switches to /.&lt;/p&gt;

&lt;p&gt;💡 The Big Takeaway&lt;br&gt;
This project wasn't just about writing React components; it was a crash course in DevOps. I learned that code doesn't live in a vacuum—it lives in environments, and mastering those environments is just as important as mastering the syntax.&lt;/p&gt;

&lt;p&gt;My Github Project Link : &lt;a href="https://github.com/Rohithv07/Tryouts/tree/main/portfolio-minimal" rel="noopener noreferrer"&gt;https://github.com/Rohithv07/Tryouts/tree/main/portfolio-minimal&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Whats new
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Latest Writing section in the portfolio that picks latest article publised in DEV.to&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the breakdown of the steps I took:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. The Strategy (Why)
&lt;/h4&gt;

&lt;p&gt;Source: Dev.to provides a free, public API (&lt;a href="https://dev.to/api/articles"&gt;https://dev.to/api/articles&lt;/a&gt;) that requires no authentication for reading public posts, making it perfect for a lightweight frontend integration.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. The Implementation (How)
&lt;/h4&gt;

&lt;p&gt;I created a new component &lt;/p&gt;

&lt;p&gt;src/components/LatestArticles.jsx&lt;br&gt;
 with the following logic:&lt;/p&gt;

&lt;h5&gt;
  
  
  Fetch Data:
&lt;/h5&gt;

&lt;p&gt;I used a useEffect hook to call &lt;a href="https://dev.to/api/articles?username=rohithv07&amp;amp;per_page=3"&gt;https://dev.to/api/articles?username=rohithv07&amp;amp;per_page=3&lt;/a&gt;.&lt;br&gt;
This returns a JSON array of latest posts, sorted by date.&lt;/p&gt;

&lt;h4&gt;
  
  
  Handle States:
&lt;/h4&gt;

&lt;p&gt;Loading: While fetching, I display 3 gray "skeleton" boxes so the layout doesn't jump around.&lt;/p&gt;

&lt;p&gt;Error: If the API fails (e.g., rate limits), I fallback gracefully to a simple "Check out my profile" button instead of crashing the page.&lt;/p&gt;

&lt;h4&gt;
  
  
  Render the UI:
&lt;/h4&gt;

&lt;p&gt;I mapped over the data to create cards.&lt;br&gt;
Visuals: I used the cover_image for visual impact and added a hover zoom effect.&lt;br&gt;
Metrics: I displayed public_reactions_count and comments_count to prove engagement (validating your "Highlights" claim).&lt;br&gt;
Integration:&lt;/p&gt;

&lt;p&gt;I placed the component in App.jsx directly after "Highlights" section. This creates a logical flow: Here is what I'm proud of (Highlights) -&amp;gt; Here is proof of my knowledge (Latest Writing).&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Automating Java Builds with GitHub Actions</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 17 Jan 2026 10:18:30 +0000</pubDate>
      <link>https://dev.to/rohithv07/automating-java-builds-with-github-actions-4c0m</link>
      <guid>https://dev.to/rohithv07/automating-java-builds-with-github-actions-4c0m</guid>
      <description>&lt;p&gt;We've all been there. You write code, it runs perfectly on your laptop, you push it, and... the build breaks for everyone else. Or worse, a bug sneaks into production because someone forgot to run the tests.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Continuous Integration&lt;/strong&gt; (CI) comes in.&lt;/p&gt;

&lt;p&gt;In this guide, we are going to break down a very simple GitHub Actions workflow that automatically builds and tests 2 Microservices application (Order Service &amp;amp; Product Service) every time you push code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem Does This Solve?
&lt;/h2&gt;

&lt;p&gt;Before we look at the code, let's understand why we need it. This YAML file lives in your repository. It solves three massive problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consistency: It builds your code in a clean, neutral environment (Ubuntu), not on your potentially messy laptop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Early Bug Detection: It runs your tests automatically on every Pull Request. You can't merge broken code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monorepo Support: It handles multiple services (OrderService and ProductService) in a single repository, ensuring a change in one doesn't break the other.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Workflow File
&lt;/h2&gt;

&lt;p&gt;Here is the complete ci.yml file we will be analyzing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Java CI with Maven&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up JDK &lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-java@v4&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;java-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;17'&lt;/span&gt;
        &lt;span class="na"&gt;distribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;temurin'&lt;/span&gt;
        &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;maven&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Test Order Service&lt;/span&gt;
      &lt;span class="na"&gt;working-directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./OrderService&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;chmod +x mvnw&lt;/span&gt;
        &lt;span class="s"&gt;./mvnw clean verify&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Test Product Service&lt;/span&gt;
      &lt;span class="na"&gt;working-directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./ProductService&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;chmod +x mvnw&lt;/span&gt;
        &lt;span class="s"&gt;./mvnw clean verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Code Breakdown
&lt;/h2&gt;

&lt;p&gt;Let's dissect the configuration line by line.&lt;/p&gt;

&lt;p&gt;1.The Setup &amp;amp; Triggers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Java CI with Maven&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;name&lt;/strong&gt;: This is how the workflow appears in the "Actions" tab on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;on&lt;/strong&gt;: These are the triggers. When does this robot wake up?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;push&lt;/strong&gt;: Runs whenever code is pushed to the main branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pull_request&lt;/strong&gt;: Runs whenever someone tries to merge code into main (Crucial for code review!).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;workflow_dispatch&lt;/strong&gt;: A feature that lets you manually click a "Run Workflow" button in the GitHub UI (great for debugging).&lt;/p&gt;

&lt;p&gt;2.The Environment (The Job)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;jobs&lt;/strong&gt;: A workflow is made of one or more jobs. Here, we just have one called build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;runs-on: ubuntu-latest&lt;/strong&gt;: This tells GitHub to provision a fresh virtual machine running the latest version of Ubuntu Linux. This is where your code will be downloaded and tested.&lt;/p&gt;

&lt;p&gt;3.The Steps (The Actual Work)&lt;/p&gt;

&lt;p&gt;Step A: Get the Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout code&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;uses&lt;/strong&gt;: This keyword pulls in a pre-made script from the GitHub Marketplace. actions/checkout is the standard action that clones your repository onto the Ubuntu runner so the script can access your files.&lt;/p&gt;

&lt;p&gt;Step B: Prepare Java&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up JDK &lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-java@v4&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;java-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;17'&lt;/span&gt;
        &lt;span class="na"&gt;distribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;temurin'&lt;/span&gt;
        &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;maven&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;uses: actions/setup-java&lt;/strong&gt;: Installs Java on the runner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;distribution: 'temurin'&lt;/strong&gt;: Specifies which vendor of Java to use (Eclipse Temurin is a popular choice).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cache: maven&lt;/strong&gt;: This speeds up your build massively! It remembers your downloaded dependencies (JARs) so it doesn't have to re-download the internet every time the build runs.&lt;/p&gt;

&lt;p&gt;Step C: Build the Microservices&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Test Order Service&lt;/span&gt;
      &lt;span class="na"&gt;working-directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./OrderService&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;chmod +x mvnw&lt;/span&gt;
        &lt;span class="s"&gt;./mvnw clean verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the magic happens. Since you have a monorepo (multiple projects in one folder), we handle them separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;working-directory&lt;/strong&gt;: Tells the runner to cd (change directory) into ./OrderService before running commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;chmod +x mvnw&lt;/strong&gt;: Grants execution permission to the Maven Wrapper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;./mvnw clean verify&lt;/strong&gt;: The command that actually builds your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why mvnw and not mvn?&lt;/strong&gt; The "Wrapper" ensures the build uses the exact Maven version defined in your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why verify?&lt;/strong&gt; In the Maven lifecycle, verify runs validation, compilation, unit tests, and integration tests. It is more robust than just install.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Set This Up in GitHub
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open your project locally or on GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the directory structure: Inside your project root, create a folder named .github and inside that, a folder named workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Path: .github/workflows/&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create the file: Create a new file named ci.yml.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste the code: Copy the YAML code we analyzed above into this file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Commit and Push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
git add .github/workflows/ci.yml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add CI pipeline"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Go to the "Actions" tab in your GitHub repository. You will see your workflow spinning up. If the circles turn Green, your code is safe. If they turn Red, you broke the build—and thankfully, you found out before your users did.&lt;/p&gt;

&lt;p&gt;Sample Setup : &lt;a href="https://github.com/Rohithv07/OnlineShopping/blob/main/.github/workflows/ci.yml" rel="noopener noreferrer"&gt;https://github.com/Rohithv07/OnlineShopping/blob/main/.github/workflows/ci.yml&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>devops</category>
      <category>github</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Java Solution: Redundant Parenthesis Detection O(N)</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 17 Jan 2026 06:29:45 +0000</pubDate>
      <link>https://dev.to/rohithv07/java-solution-redundant-parenthesis-detection-on-h17</link>
      <guid>https://dev.to/rohithv07/java-solution-redundant-parenthesis-detection-on-h17</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Given a string of balanced expression s, check if it contains a redundant parenthesis or not. A set of parenthesis are redundant if the same sub-expression is surrounded by unnecessary or multiple brackets.&lt;br&gt;
Note: Expression may contain + , — , *, and / operators. Given expression is valid and there are no white spaces present.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples:
&lt;/h3&gt;

&lt;p&gt;Input: s = "((a+b))"&lt;br&gt;
Output: true &lt;br&gt;
Explanation: ((a+b)) can reduced to (a+b).&lt;/p&gt;

&lt;p&gt;Input: s = "(a+(b)/c)"&lt;br&gt;
Output: true&lt;br&gt;
Explanation: (a+(b)/c) can reduced to (a+b/c) because b is surrounded by () which is redundant.&lt;/p&gt;

&lt;p&gt;Input: s = "(a+b+(c+d))"&lt;br&gt;
Output: false&lt;br&gt;
Explanation:(a+b+(c+d)) doesn't have any redundant or multiple brackets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints:
&lt;/h2&gt;

&lt;p&gt;1 ≤ |s| ≤10^5&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;In a naive approach, we might treat the string as a sequence of sub-expressions. The goal is to isolate every pair of matching parentheses ( ... ) and check the contents inside them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Algorithm
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Iterate through the string to find an opening bracket (.&lt;/li&gt;
&lt;li&gt;Scan forward to find the matching closing bracket ).&lt;/li&gt;
&lt;li&gt;Extract the substring between them.
4.Scan that substring:

&lt;ul&gt;
&lt;li&gt;Does it contain an operator (+, -, *, /)?&lt;/li&gt;
&lt;li&gt;If No, the brackets are redundant (e.g., (a)).&lt;/li&gt;
&lt;li&gt;If Yes, checking isn’t done yet — we have to ensure we didn’t just        capture a nested redundant pair like ((a+b)).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why this is inefficient
&lt;/h3&gt;

&lt;p&gt;Complexity: finding a matching bracket and extracting substrings repeatedly forces us to scan the string multiple times. In the worst case (deeply nested brackets), this approaches O(N²) time complexity.&lt;br&gt;
Messy Logic: Handling nested structures like ((a+b)*(c-d)) without a stack requires complex index tracking to ensure you are looking at the correct matching bracket, not just the next one you see.&lt;/p&gt;

&lt;p&gt;We need a way to process the expression in a single pass (O(N)). Since the problem involves nested structures (brackets inside brackets), the Last-In-First-Out (LIFO) property of a Stack is the perfect tool.&lt;/p&gt;

&lt;p&gt;Instead of scanning forward to find the end of a bracket pair, we can process characters as they come and “resolve” them when we hit a closing bracket ).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Optimal Stack Approach
&lt;/h3&gt;

&lt;p&gt;We treat the Stack as a “holding area” for the parts of the expression we haven’t finished evaluating yet.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Iterate through the expression.&lt;/li&gt;
&lt;li&gt;If we see an open bracket ( or an operator: Push it onto the stack. These are the components that might be part of a valid sub-expression.&lt;/li&gt;
&lt;li&gt;If we see a closing bracket ): This is our trigger. It means a sub-expression has just ended. We need to check if that sub-expression was "useful."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4.Start popping from the stack until we hit the matching (.&lt;br&gt;
While popping, did we encounter an operator?&lt;br&gt;
Yes: The brackets enclosed an operation (e.g., (a+b)), so they were necessary.&lt;br&gt;
No: The brackets enclosed nothing of value (e.g., (a) or ()), so they are Redundant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvike1m1dwrw0gpoxm0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvike1m1dwrw0gpoxm0w.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Time and Space Complexity
&lt;/h2&gt;

&lt;p&gt;Time O(N): Single pass iteration, each element pushed/popped once.&lt;/p&gt;

&lt;p&gt;Space O(N): Stack acts as a buffer; worst case stores all characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;checkRedundancy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// code here&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isRedundant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;')'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sc"&gt;'('&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;topChar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isValidOperator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topChar&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;isRedundant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isRedundant&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isValidChar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isValidOperator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'/'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'*'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isValidChar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isValidOperator&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'('&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>coding</category>
      <category>learning</category>
    </item>
    <item>
      <title>Leetcode 3613. Minimize Maximum Component Cost</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sun, 13 Jul 2025 06:55:46 +0000</pubDate>
      <link>https://dev.to/rohithv07/leetcode-3613-minimize-maximum-component-cost-45ah</link>
      <guid>https://dev.to/rohithv07/leetcode-3613-minimize-maximum-component-cost-45ah</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;You are given an undirected connected graph with n nodes labeled from 0 to n - 1 and a 2D integer array edges where edges[i] = [ui, vi, wi] denotes an undirected edge between node ui and node vi with weight wi, and an integer k.&lt;/p&gt;

&lt;p&gt;You are allowed to remove any number of edges from the graph such that the resulting graph has at most k connected components.&lt;/p&gt;

&lt;p&gt;The cost of a component is defined as the maximum edge weight in that component. If a component has no edges, its cost is 0.&lt;/p&gt;

&lt;p&gt;Return the minimum possible value of the maximum cost among all components after such removals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Cases
&lt;/h2&gt;

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

&lt;p&gt;Input: n = 5, edges = [[0,1,4],[1,2,3],[1,3,2],[3,4,6]], k = 2&lt;/p&gt;

&lt;p&gt;Output: 4&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;Remove the edge between nodes 3 and 4 (weight 6).&lt;br&gt;
The resulting components have costs of 0 and 4, so the overall maximum cost is 4.&lt;br&gt;
Example 2:&lt;/p&gt;

&lt;p&gt;Input: n = 4, edges = [[0,1,5],[1,2,5],[2,3,5]], k = 1&lt;/p&gt;

&lt;p&gt;Output: 5&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;No edge can be removed, since allowing only one component (k = 1) requires the graph to stay fully connected.&lt;br&gt;
That single component’s cost equals its largest edge weight, which is 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints:
&lt;/h2&gt;

&lt;p&gt;1 &amp;lt;= n &amp;lt;= 5 * 10^4&lt;br&gt;
0 &amp;lt;= edges.length &amp;lt;= 10^5&lt;br&gt;
edges[i].length == 3&lt;br&gt;
0 &amp;lt;= ui, vi &amp;lt; n&lt;br&gt;
1 &amp;lt;= wi &amp;lt;= 10^6&lt;br&gt;
1 &amp;lt;= k &amp;lt;= n&lt;br&gt;
The input graph is connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;From the problem statement, we need to find the &lt;strong&gt;minimum possible value of the maximum edge weight&lt;/strong&gt; such that, if we remove all edges with weight greater than this value, the graph splits into &lt;strong&gt;at most &lt;code&gt;k&lt;/code&gt; connected components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This hints at a &lt;strong&gt;binary search&lt;/strong&gt; strategy on the edge weights, because we’re looking for the &lt;em&gt;minimum value&lt;/em&gt; satisfying a condition.&lt;/p&gt;

&lt;p&gt;The concept of &lt;strong&gt;connected components&lt;/strong&gt; immediately suggests using &lt;strong&gt;Union Find (Disjoint Set Union - DSU)&lt;/strong&gt; or &lt;strong&gt;DFS/BFS&lt;/strong&gt;. Since DSU is more efficient for repeated connectivity queries, it's the preferred choice here.&lt;/p&gt;

&lt;p&gt;So the idea is:&lt;br&gt;&lt;br&gt;
🔍 &lt;strong&gt;Use binary search on the edge weight&lt;/strong&gt; — and for each weight &lt;code&gt;W&lt;/code&gt;, check if the number of connected components formed using only edges ≤ &lt;code&gt;W&lt;/code&gt; is ≤ &lt;code&gt;k&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Identify the &lt;strong&gt;maximum edge weight&lt;/strong&gt; in the graph — this is the upper bound for binary search.&lt;/li&gt;
&lt;li&gt;Perform &lt;strong&gt;binary search&lt;/strong&gt; in the range &lt;code&gt;[0, maxWeight]&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;For each midpoint weight &lt;code&gt;W&lt;/code&gt;, consider only edges with weight ≤ &lt;code&gt;W&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Union Find&lt;/strong&gt; to connect nodes using only those edges.&lt;/li&gt;
&lt;li&gt;Count the number of connected components formed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If the number of components is ≤ &lt;code&gt;k&lt;/code&gt;, then &lt;code&gt;W&lt;/code&gt; is a &lt;strong&gt;valid candidate&lt;/strong&gt;, but try to find a smaller one (move &lt;code&gt;right = mid - 1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;If more than &lt;code&gt;k&lt;/code&gt; components are formed, then &lt;code&gt;W&lt;/code&gt; is &lt;strong&gt;too small&lt;/strong&gt; (move &lt;code&gt;left = mid + 1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Finally, return the &lt;strong&gt;smallest weight&lt;/strong&gt; that satisfies the condition.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F710tiydna3xjuu3qdy0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F710tiydna3xjuu3qdy0x.png" alt="Connected Components" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Time Complexity:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;O(log(maxWeight) * E * α(N))&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Binary Search: &lt;code&gt;O(log(maxWeight))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each check: Union-Find over all &lt;code&gt;E&lt;/code&gt; edges → &lt;code&gt;O(E * α(N))&lt;/code&gt;, where &lt;code&gt;α(N)&lt;/code&gt; is the inverse Ackermann function (nearly constant time).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Space Complexity:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;O(N)&lt;/code&gt; for Union-Find structures&lt;/p&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;minCost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxWeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;maxWeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxWeight&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edge&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="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;findMinCost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxWeight&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;findMinCost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxWeight&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maxWeight&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&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="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;low&lt;/span&gt;&lt;span class="o"&gt;)&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isGraphHaveKComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&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="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&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="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isGraphHaveKComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;currentMaxWeight&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;UnionFind&lt;/span&gt; &lt;span class="n"&gt;unionFind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UnionFind&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;edge&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;edge&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;currentMaxWeight&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;unionFind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;union&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;unionFind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getComponentCount&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UnionFind&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;componentCount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UnionFind&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"N cannot be less or equal to 0"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;componentCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;rank&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;]&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="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;union&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;parentNode1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;parentNode2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parentNode1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode1&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parentNode1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parentNode2&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;componentCount&lt;/span&gt;&lt;span class="o"&gt;--;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isConnectedComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;findParent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getComponentCount&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;componentCount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>learning</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Leetcode 1751. Maximum Number of Events That Can Be Attended II</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Tue, 08 Jul 2025 18:33:04 +0000</pubDate>
      <link>https://dev.to/rohithv07/leetcode-1751-maximum-number-of-events-that-can-be-attended-ii-4ol6</link>
      <guid>https://dev.to/rohithv07/leetcode-1751-maximum-number-of-events-that-can-be-attended-ii-4ol6</guid>
      <description>&lt;h1&gt;
  
  
  Problem Statement
&lt;/h1&gt;

&lt;p&gt;You are given an array of events where events[i] = [startDayi, endDayi, valuei]. The ith event starts at startDayi and ends at endDayi, and if you attend this event, you will receive a value of valuei. You are also given an integer k which represents the maximum number of events you can attend.&lt;/p&gt;

&lt;p&gt;You can only attend one event at a time. If you choose to attend an event, you must attend the entire event. Note that the end day is inclusive: that is, you cannot attend two events where one of them starts and the other ends on the same day.&lt;/p&gt;

&lt;p&gt;Return the maximum sum of values that you can receive by attending events.&lt;/p&gt;




&lt;h1&gt;
  
  
  Test Cases
&lt;/h1&gt;

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

&lt;p&gt;Input: events = [[1,2,4],[3,4,3],[2,3,1]], k = 2&lt;br&gt;
Output: 7&lt;br&gt;
Explanation: Choose the green events, 0 and 1 (0-indexed) for a total value of 4 + 3 = 7.&lt;/p&gt;

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

&lt;p&gt;Input: events = [[1,2,4],[3,4,3],[2,3,10]], k = 2&lt;br&gt;
Output: 10&lt;br&gt;
Explanation: Choose event 2 for a total value of 10.&lt;/p&gt;

&lt;p&gt;Notice that you cannot attend any other event as they overlap, and that you do not have to attend k events.&lt;/p&gt;

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

&lt;p&gt;Input: events = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]], k = 3&lt;br&gt;
Output: 9&lt;br&gt;
Explanation: Although the events do not overlap, you can only attend 3 events. Pick the highest valued three.&lt;/p&gt;




&lt;h1&gt;
  
  
  Intuition
&lt;/h1&gt;

&lt;p&gt;The core idea is to evaluate, for each event, two possible decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Skip the event: simply move to the next index.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attend the event: add its value, and move to the next available event that starts after the current event’s end day.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we're constrained by a limit of k events, and decisions depend on both current index and remaining count k, this naturally leads to overlapping subproblems — perfect for memoization.&lt;/p&gt;

&lt;p&gt;To efficiently find the next non-overlapping event, we use binary search, as the events are sorted by start time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;if we skip, then 0 + f(event, index + 1, k)&lt;br&gt;
if we do not skip, then val + f(event, index + 1, k - 1)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Approach
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sort&lt;/strong&gt; the events by their &lt;code&gt;startDay&lt;/code&gt; to enable binary search.&lt;/li&gt;
&lt;li&gt;Define a recursive function &lt;code&gt;findMaxValue(events, k, index, dp)&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Base case: if &lt;code&gt;k == 0&lt;/code&gt; or &lt;code&gt;index&lt;/code&gt; is out of bounds, return 0.&lt;/li&gt;
&lt;li&gt;Memoization: return cached value if already computed.&lt;/li&gt;
&lt;li&gt;Recursive logic:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skip&lt;/strong&gt; the current event → &lt;code&gt;findMaxValue(events, k, index + 1)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attend&lt;/strong&gt; the event → add its value + recurse from the next non-overlapping event.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use binary search to find the next non-overlapping event whose &lt;code&gt;startDay &amp;gt; current.endDay&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Store results in &lt;code&gt;dp[index][k]&lt;/code&gt; to avoid recomputation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizsbarvwhej5l82kugzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizsbarvwhej5l82kugzk.png" alt="Recursion tree" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Complexity
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Time Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;O(n log n + n * k)&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Sorting: &lt;code&gt;O(n log n)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each state &lt;code&gt;dp[i][k]&lt;/code&gt; is computed once.&lt;/li&gt;
&lt;li&gt;Binary search per state is &lt;code&gt;O(log n)&lt;/code&gt; but efficient in practice.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Space Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;O(n * k)&lt;/code&gt; for the memoization table.&lt;/li&gt;
&lt;li&gt;Recursion stack space: &lt;code&gt;O(k)&lt;/code&gt; in the worst case.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;maxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt; 
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;k&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="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;,&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="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;findMaxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;findMaxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&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="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;skipEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findMaxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&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="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nextIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findNextStart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&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="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;attendEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextIndex&lt;/span&gt; &lt;span class="o"&gt;!=&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="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;attendEvent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;findMaxValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&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="n"&gt;nextIndex&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skipEvent&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attendEvent&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;findNextStart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&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="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;)&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&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="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;middle&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="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>java</category>
      <category>programming</category>
      <category>algorithms</category>
      <category>interview</category>
    </item>
    <item>
      <title>Next Greater Element in Circular Array</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Mon, 07 Jul 2025 18:28:21 +0000</pubDate>
      <link>https://dev.to/rohithv07/next-greater-element-in-circular-array-1g6k</link>
      <guid>https://dev.to/rohithv07/next-greater-element-in-circular-array-1g6k</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Given a circular integer array arr[], the task is to determine the next greater element (NGE) for each element in the array.&lt;/p&gt;

&lt;p&gt;The next greater element of an element arr[i] is the first element that is greater than arr[i] when traversing circularly. If no such element exists, return -1 for that position.&lt;/p&gt;

&lt;p&gt;Circular Property:&lt;/p&gt;

&lt;p&gt;Since the array is circular, after reaching the last element, the search continues from the beginning until we have looked at all elements once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples:
&lt;/h2&gt;

&lt;p&gt;Input: arr[] = [1, 3, 2, 4]&lt;br&gt;
Output: [3, 4, 4, -1]&lt;br&gt;
Explanation:&lt;br&gt;
The next greater element for 1 is 3.&lt;br&gt;
The next greater element for 3 is 4.&lt;br&gt;
The next greater element for 2 is 4.&lt;br&gt;
The next greater element for 4 does not exist, so return -1.&lt;/p&gt;

&lt;p&gt;Input: arr[] = [0, 2, 3, 1, 1]&lt;br&gt;
Output: [2, 3, -1, 2, 2]&lt;br&gt;
Explanation:&lt;br&gt;
The next greater element for 0 is 2.&lt;br&gt;
The next greater element for 2 is 3.&lt;br&gt;
The next greater element for 3 does not exist, so return -1.&lt;br&gt;
The next greater element for 1 is 2 (from circular traversal).&lt;br&gt;
The next greater element for 1 is 2 (from circular traversal).&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints:
&lt;/h2&gt;

&lt;p&gt;1 ≤ arr.size() ≤ 10^5&lt;br&gt;
0 ≤ arr[i] ≤ 10^6&lt;/p&gt;

&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;To find the next greater element for each value in a circular array, we need to determine, for each number, the next number in traversal order that is strictly greater than it.&lt;/p&gt;

&lt;p&gt;We use a stack to keep track of the indices of elements for which we haven't yet found a next greater element. When we encounter a new number, we compare it with the elements indexed at the top of the stack:&lt;/p&gt;

&lt;p&gt;If the current number is greater than the one at the stack's top, then it's the "next greater element" for that previous number — we pop and record the result.&lt;/p&gt;

&lt;p&gt;We repeat this until we can't find more matches or the stack is empty.&lt;/p&gt;

&lt;p&gt;Since the array is circular, we iterate from 0 to 2 * n - 1 and use index % n to simulate wrapping around.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Important note: We only push indices less than n into the stack to avoid redundant processing in the second half (which is just to simulate the circular nature).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check for null or empty input and return an empty list if so.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize a stack for indices and an integer array result of length n.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loop i from 0 to 2*n – 1:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Let j = i % n.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While the stack is not empty and arr[stack.peek()] &amp;lt; arr[j], pop an index and set result[pop] = arr[j].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If i &amp;lt; n, push j onto the stack.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After the loop, any indices still in the stack have no next greater element; set their result entry to -1.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert result into an ArrayList and return it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feerbsy1i8vilsk9ntjb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feerbsy1i8vilsk9ntjb8.png" alt="Circular next greater element" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Complexity
&lt;/h2&gt;

&lt;p&gt;Time: O(n) — each element is pushed and popped at most once over the 2n iterations.&lt;/p&gt;

&lt;p&gt;Space: O(n) — for the stack and the result array/list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;nextLargerElement&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// code here&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&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="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;currentIndex&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pop&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;}&lt;/span&gt;
        &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;resultList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>learning</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Maximum Score From Subarray Mins</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 05 Jul 2025 06:39:25 +0000</pubDate>
      <link>https://dev.to/rohithv07/maximum-score-from-subarray-mins-4op6</link>
      <guid>https://dev.to/rohithv07/maximum-score-from-subarray-mins-4op6</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;You are given an array arr[] of integers. Your task is to find the maximum sum of the smallest and second smallest elements across all subarrays (of size &amp;gt;= 2) of the given array.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input cases
&lt;/h2&gt;

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

&lt;p&gt;Input: arr[] = [4, 3, 5, 1]&lt;br&gt;
Output: 8&lt;br&gt;
Explanation: All subarrays with at least 2 elements and find the two smallest numbers in each:&lt;br&gt;
[4, 3] → 3 + 4 = 7&lt;br&gt;
[4, 3, 5] → 3 + 4 = 7&lt;br&gt;
[4, 3, 5, 1] → 1 + 3 = 4&lt;br&gt;
[3, 5] → 3 + 5 = 8&lt;br&gt;
[3, 5, 1] → 1 + 3 = 4&lt;br&gt;
[5, 1] → 1 + 5 = 6&lt;br&gt;
Maximum Score is 8.&lt;br&gt;
Input: arr[] = [1, 2, 3]&lt;br&gt;
Output: 5&lt;br&gt;
Explanation: All subarray with at least 2 elements and find the two smallest numbers in each:&lt;br&gt;
[1, 2] → 1 + 2 = 3&lt;br&gt;
[1, 2, 3] → 1 + 2 = 3&lt;br&gt;
[2, 3] → 2 + 3 = 5&lt;br&gt;
Maximum Score is 5&lt;/p&gt;

&lt;h2&gt;
  
  
  Constraints:
&lt;/h2&gt;

&lt;p&gt;2 ≤ arr.size() ≤ 10^5&lt;br&gt;
1 ≤ arr[i] ≤ 10^6&lt;/p&gt;

&lt;h2&gt;
  
  
  Intuition
&lt;/h2&gt;

&lt;p&gt;Instead of iterating through all possible subarrays and finding the smallest and second smallest elements (which is inefficient), we can simplify the problem using the following observation:&lt;/p&gt;

&lt;p&gt;To maximize the sum of the two smallest elements in a subarray, both of them should be as large as possible.&lt;/p&gt;

&lt;p&gt;This naturally leads us to a key insight:&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Insight:
&lt;/h2&gt;

&lt;p&gt;Among all subarrays of size ≥ 2, the ones with only 2 elements are sufficient to check.&lt;/p&gt;

&lt;p&gt;Why? Because:&lt;/p&gt;

&lt;p&gt;In a longer subarray (size ≥ 3), the two smallest elements tend to be smaller, hence their sum is also smaller.&lt;/p&gt;

&lt;p&gt;With just 2 elements, we know the smallest and second smallest directly — it's just the two numbers themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Initialize a variable maxSum to 0.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Loop through the array and for every adjacent pair, calculate their sum.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update maxSum with the maximum of the current sum and the existing maxSum.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Return maxSum at the end.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2puxy227ebyvpkzb9raa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2puxy227ebyvpkzb9raa.png" alt="Dry Run" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Time and Space Complexity
&lt;/h2&gt;

&lt;p&gt;Time Complexity: O(N) where N is the length of the array.&lt;br&gt;
Space Complexity: O(1) as no extra space is used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;maxSum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxSum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&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="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;maxSum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxSum&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&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="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxSum&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>learning</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Leetcode 2099. Find Subsequence of Length K With the Largest Sum</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 28 Jun 2025 06:43:30 +0000</pubDate>
      <link>https://dev.to/rohithv07/leetcode-2099-find-subsequence-of-length-k-with-the-largest-sum-2c8e</link>
      <guid>https://dev.to/rohithv07/leetcode-2099-find-subsequence-of-length-k-with-the-largest-sum-2c8e</guid>
      <description>&lt;h1&gt;
  
  
  Problem
&lt;/h1&gt;

&lt;p&gt;You are given an integer array nums and an integer k. You want to find a subsequence of nums of length k that has the largest sum.&lt;/p&gt;

&lt;p&gt;Return any such subsequence as an integer array of length k.&lt;/p&gt;

&lt;p&gt;A subsequence is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.&lt;/p&gt;

&lt;h1&gt;
  
  
  Testcases
&lt;/h1&gt;

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

&lt;p&gt;Input: nums = [2,1,3,3], k = 2&lt;br&gt;
Output: [3,3]&lt;br&gt;
Explanation:&lt;br&gt;
The subsequence has the largest sum of 3 + 3 = 6.&lt;br&gt;
Example 2:&lt;/p&gt;

&lt;p&gt;Input: nums = [-1,-2,3,4], k = 3&lt;br&gt;
Output: [-1,3,4]&lt;br&gt;
Explanation: &lt;br&gt;
The subsequence has the largest sum of -1 + 3 + 4 = 6.&lt;br&gt;
Example 3:&lt;/p&gt;

&lt;p&gt;Input: nums = [3,4,3,3], k = 2&lt;br&gt;
Output: [3,4]&lt;br&gt;
Explanation:&lt;br&gt;
The subsequence has the largest sum of 3 + 4 = 7. &lt;br&gt;
Another possible subsequence is [4, 3].&lt;/p&gt;

&lt;h1&gt;
  
  
  Constraints:
&lt;/h1&gt;

&lt;p&gt;1 &amp;lt;= nums.length &amp;lt;= 1000&lt;br&gt;
-10^5 &amp;lt;= nums[i] &amp;lt;= 10^5&lt;br&gt;
1 &amp;lt;= k &amp;lt;= nums.length&lt;/p&gt;

&lt;h1&gt;
  
  
  Intuition
&lt;/h1&gt;

&lt;p&gt;To achieve the largest possible sum of a subsequence of length k, it makes sense to select the k largest elements from the array. However, since a subsequence must preserve the original order of elements, we can't simply sort and pick — we must track both the value and the original index.&lt;/p&gt;

&lt;h1&gt;
  
  
  Approach
&lt;/h1&gt;

&lt;p&gt;Use a min-heap (priority queue) to maintain the top k largest elements. Each element in the heap is a pair of [value, index].&lt;/p&gt;

&lt;p&gt;When the heap size exceeds k, remove the smallest element. This ensures the heap always contains the k largest elements.&lt;/p&gt;

&lt;p&gt;Use a TreeMap to store the k elements with their original indices as keys. This automatically sorts them by index to preserve their relative order.&lt;/p&gt;

&lt;p&gt;Build the result array by traversing the TreeMap in key order.&lt;/p&gt;

&lt;h1&gt;
  
  
  Time Complexity
&lt;/h1&gt;

&lt;p&gt;O(n log k) — inserting into the heap for n elements with max size k&lt;/p&gt;

&lt;p&gt;O(k log k) — for TreeMap insertion and sorting by index&lt;/p&gt;

&lt;p&gt;O(k) — to construct the result array&lt;br&gt;
Total: O(n log k + k log k)&lt;/p&gt;

&lt;h1&gt;
  
  
  Space Complexity
&lt;/h1&gt;

&lt;p&gt;O(k) — for the heap and the TreeMap&lt;/p&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;maxSubsequence&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]{};&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="nc"&gt;PriorityQueue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;minHeap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PriorityQueue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;((&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]));&lt;/span&gt;
        &lt;span class="nc"&gt;TreeMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;kIndexNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TreeMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;minHeap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;offer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]{&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;});&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minHeap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;minHeap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;resultIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;minHeap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;minHeap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;kIndexNumber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top&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="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kIndexNumber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;resultIndex&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kIndexNumber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>learning</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Leetcode 1432. Max Difference You Can Get From Changing an Integer</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sat, 28 Jun 2025 06:41:31 +0000</pubDate>
      <link>https://dev.to/rohithv07/leetcode-1432-max-difference-you-can-get-from-changing-an-integer-3g2g</link>
      <guid>https://dev.to/rohithv07/leetcode-1432-max-difference-you-can-get-from-changing-an-integer-3g2g</guid>
      <description>&lt;h1&gt;
  
  
  Problem Statement
&lt;/h1&gt;

&lt;p&gt;You are given an integer num. You will apply the following steps to num two separate times:&lt;/p&gt;

&lt;p&gt;Pick a digit x (0 &amp;lt;= x &amp;lt;= 9).&lt;br&gt;
Pick another digit y (0 &amp;lt;= y &amp;lt;= 9). Note y can be equal to x.&lt;br&gt;
Replace all the occurrences of x in the decimal representation of num by y.&lt;br&gt;
Let a and b be the two results from applying the operation to num independently.&lt;/p&gt;

&lt;p&gt;Return the max difference between a and b.&lt;/p&gt;

&lt;p&gt;Note that neither a nor b may have any leading zeros, and must not be 0.&lt;/p&gt;

&lt;h1&gt;
  
  
  Test Cases
&lt;/h1&gt;

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

&lt;p&gt;Input: num = 555&lt;br&gt;
Output: 888&lt;br&gt;
Explanation: The first time pick x = 5 and y = 9 and store the new integer in a.&lt;br&gt;
The second time pick x = 5 and y = 1 and store the new integer in b.&lt;br&gt;
We have now a = 999 and b = 111 and max difference = 888&lt;br&gt;
Example 2:&lt;/p&gt;

&lt;p&gt;Input: num = 9&lt;br&gt;
Output: 8&lt;br&gt;
Explanation: The first time pick x = 9 and y = 9 and store the new integer in a.&lt;br&gt;
The second time pick x = 9 and y = 1 and store the new integer in b.&lt;br&gt;
We have now a = 9 and b = 1 and max difference = 8&lt;/p&gt;

&lt;h1&gt;
  
  
  Constraints:
&lt;/h1&gt;

&lt;p&gt;1 &amp;lt;= num &amp;lt;= 10^8&lt;/p&gt;

&lt;h1&gt;
  
  
  Intuition
&lt;/h1&gt;

&lt;p&gt;We care about the maximum value that we can get by replacing some digit with x and minimum value that we can get by replacing some digit with y.&lt;br&gt;
This will always gives a maximum different.&lt;br&gt;
To get the maximum value, we can replace the first digit which is not 9 with 9. This will give us the max value as 9.&lt;br&gt;
Eg : &lt;br&gt;
92321 =&amp;gt; replacing 2 with 9 =&amp;gt; 99391&lt;/p&gt;

&lt;p&gt;Similarly we need to get the minimum value. Incase of minimum value, there are two cases to consider.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the first number is &amp;gt; 1, in that case, we can replace it with 1 and it will give us the minimum.
Eg : 92321 =&amp;gt; replace 9 by 1 =&amp;gt; 12321.
We can replace by 0, as no leading zero is allowed.&lt;/li&gt;
&lt;li&gt;Another case if first number is already 1. If it is already 1, then we need to find the number &amp;gt; 1 and replace it with 0.
Eg : 11112 =&amp;gt; replace last 2 by 0 =&amp;gt; 11110&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Difference between them will give us the result.&lt;/p&gt;

&lt;h1&gt;
  
  
  Approach
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Convert the number to string for easy processing.&lt;/li&gt;
&lt;li&gt;Find the first digit which is not 9 and convert all its occurance to 9. This is our max.&lt;/li&gt;
&lt;li&gt;Find the digit which is either &amp;gt; 1, replace it 1 or if its already 1, replace with 0.&lt;/li&gt;
&lt;li&gt;Parse it to get the intervalue and take the different.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Complexity
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Time complexity:&lt;/p&gt;



&lt;p&gt;O(10) as we are going through the digit, as there can be only 10 digit max.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Space complexity:&lt;/p&gt;



&lt;p&gt;O(10) as we are creating strings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Solution {
    public int maxDiff(int num) {
        char [] forMax = Integer.toString(num).toCharArray();
        char [] forMin = Integer.toString(num).toCharArray();
        // for maximum value, replace the first non 9 digit to 9
        // for minimum, we have 2 case,
        // if first letter is 1, then first character which is not 1 should be replaced to 0
        // else first letter &amp;gt; 1 should be relaced with 1. This is because leading 0 is not allowed.
        int right = 0;
        int length = forMax.length;
        while (right &amp;lt; length &amp;amp;&amp;amp; forMax[right] == '9') {
            right++;
        }
        int maxValue = 0;
        int minValue = 0;
        if (right == length) {
            maxValue = Integer.parseInt(new String(forMax));
        }
        else {
            char target = forMax[right];
            while (right &amp;lt; length) {
                if (forMax[right] == target)
                    forMax[right] = '9';
                right++;
            }
            maxValue = Integer.parseInt(new String(forMax));
        }
        // System.out.println(maxValue);
        if (forMin[0] - '0' &amp;gt; 1) {
            char target = forMin[0];
            for (int index = 0; index &amp;lt; length; index++) {
                if (forMin[index] == target) {
                    forMin[index] = '1';
                }
            }
            minValue = Integer.parseInt(new String(forMin));
        }
        else {
            right = 0;
            while (right &amp;lt; length &amp;amp;&amp;amp; forMin[right] - '0' &amp;lt;= 1) {
                right++;
            }
            if (right == length) {
                minValue = Integer.parseInt(new String(forMin));
            }
            else {
                char target = forMin[right];
                while (right &amp;lt; length) {
                    if (forMin[right] == target)
                        forMin[right] = '0';
                    right++;
                }
                minValue = Integer.parseInt(new String(forMin));
            }
        }
        // System.out.println(minValue);
        return maxValue - minValue;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>coding</category>
      <category>learning</category>
    </item>
    <item>
      <title>Leetcode 1432. Max Difference You Can Get From Changing an Integer</title>
      <dc:creator>Rohith V</dc:creator>
      <pubDate>Sun, 15 Jun 2025 12:09:57 +0000</pubDate>
      <link>https://dev.to/rohithv07/leetcode-1432-max-difference-you-can-get-from-changing-an-integer-25g7</link>
      <guid>https://dev.to/rohithv07/leetcode-1432-max-difference-you-can-get-from-changing-an-integer-25g7</guid>
      <description>&lt;h1&gt;
  
  
  Problem Statement
&lt;/h1&gt;

&lt;p&gt;You are given an integer num. You will apply the following steps to num two separate times:&lt;/p&gt;

&lt;p&gt;Pick a digit x (0 &amp;lt;= x &amp;lt;= 9).&lt;br&gt;
Pick another digit y (0 &amp;lt;= y &amp;lt;= 9). Note y can be equal to x.&lt;br&gt;
Replace all the occurrences of x in the decimal representation of num by y.&lt;br&gt;
Let a and b be the two results from applying the operation to num independently.&lt;/p&gt;

&lt;p&gt;Return the max difference between a and b.&lt;/p&gt;

&lt;p&gt;Note that neither a nor b may have any leading zeros, and must not be 0.&lt;/p&gt;

&lt;h1&gt;
  
  
  Test Cases
&lt;/h1&gt;

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

&lt;p&gt;Input: num = 555&lt;br&gt;
Output: 888&lt;br&gt;
Explanation: The first time pick x = 5 and y = 9 and store the new integer in a.&lt;br&gt;
The second time pick x = 5 and y = 1 and store the new integer in b.&lt;br&gt;
We have now a = 999 and b = 111 and max difference = 888&lt;br&gt;
Example 2:&lt;/p&gt;

&lt;p&gt;Input: num = 9&lt;br&gt;
Output: 8&lt;br&gt;
Explanation: The first time pick x = 9 and y = 9 and store the new integer in a.&lt;br&gt;
The second time pick x = 9 and y = 1 and store the new integer in b.&lt;br&gt;
We have now a = 9 and b = 1 and max difference = 8&lt;/p&gt;

&lt;h1&gt;
  
  
  Constraints:
&lt;/h1&gt;

&lt;p&gt;1 &amp;lt;= num &amp;lt;= 10^8&lt;/p&gt;

&lt;h1&gt;
  
  
  Intuition
&lt;/h1&gt;

&lt;p&gt;We care about the maximum value that we can get by replacing some digit with x and minimum value that we can get by replacing some digit with y.&lt;br&gt;
This will always gives a maximum different.&lt;br&gt;
To get the maximum value, we can replace the first digit which is not 9 with 9. This will give us the max value as 9.&lt;br&gt;
Eg : &lt;br&gt;
92321 =&amp;gt; replacing 2 with 9 =&amp;gt; 99391&lt;/p&gt;

&lt;p&gt;Similarly we need to get the minimum value. Incase of minimum value, there are two cases to consider.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the first number is &amp;gt; 1, in that case, we can replace it with 1 and it will give us the minimum.
Eg : 92321 =&amp;gt; replace 9 by 1 =&amp;gt; 12321.
We can replace by 0, as no leading zero is allowed.&lt;/li&gt;
&lt;li&gt;Another case if first number is already 1. If it is already 1, then we need to find the number &amp;gt; 1 and replace it with 0.
Eg : 11112 =&amp;gt; replace last 2 by 0 =&amp;gt; 11110&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Difference between them will give us the result.&lt;/p&gt;

&lt;h1&gt;
  
  
  Approach
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Convert the number to string for easy processing.&lt;/li&gt;
&lt;li&gt;Find the first digit which is not 9 and convert all its occurance to 9. This is our max.&lt;/li&gt;
&lt;li&gt;Find the digit which is either &amp;gt; 1, replace it 1 or if its already 1, replace with 0.&lt;/li&gt;
&lt;li&gt;Parse it to get the intervalue and take the different.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Complexity
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Time complexity:&lt;/p&gt;



&lt;p&gt;O(10) as we are going through the digit, as there can be only 10 digit max.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Space complexity:&lt;/p&gt;



&lt;p&gt;O(10) as we are creating strings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;maxDiff&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;forMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;forMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// for maximum value, replace the first non 9 digit to 9&lt;/span&gt;
        &lt;span class="c1"&gt;// for minimum, we have 2 case,&lt;/span&gt;
        &lt;span class="c1"&gt;// if first letter is 1, then first character which is not 1 should be replaced to 0&lt;/span&gt;
        &lt;span class="c1"&gt;// else first letter &amp;gt; 1 should be relaced with 1. This is because leading 0 is not allowed.&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'9'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;minValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;maxValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'9'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;maxValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMax&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// System.out.println(maxValue);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'1'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;minValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;minValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;minValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forMin&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// System.out.println(minValue);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maxValue&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;minValue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>java</category>
      <category>programming</category>
      <category>coding</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
