Arrays

Two Sum (LeetCode 1)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int diff = target - nums[i];
            if (map.containsKey(diff))
                return new int[]{map.get(diff), i};
            map.put(nums[i], i);
        }
        return new int[]{};
    }
}
  • Approach: Use a HashMap to store seen values and check for complement in O(n).
  • Dry run (nums = [2,7,11,15], target = 9):
    • i=0, num=2, diff=7, map={}, not found → put 2:0
    • i=1, num=7, diff=2, map has 2 → return [0,1]

Remove Duplicates from Sorted Array (LeetCode 26)

class Solution {
    public int removeDuplicates(int[] nums) {
        int j = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != nums[i - 1])
                nums[j++] = nums[i];
        }
        return j;
    }
}
  • Approach: Two pointers; write unique elements forward.
  • Dry run (nums = [1,1,2]):
    • j=1
    • i=1: nums[1]=1 == nums[0]=1 → skip
    • i=2: nums[2]=2 != nums[1]=1 → nums[1]=2, j=2
    • Result length=2; array becomes [1,2,_]

Search Insert Position (LeetCode 35)

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) return mid;
            else if (nums[mid] < target) left = mid + 1;
            else right = mid - 1;
        }
        return left;
    }
}
  • Approach: Binary search; return insertion point when not found.
  • Dry run (nums=[1,3,5,6], target=5):
    • left=0,right=3 → mid=1,val=3 < 5 → left=2
    • left=2,right=3 → mid=2,val=5 == 5 → return 2

Plus One (LeetCode 66)

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            }
            digits[i] = 0;
        }
        int[] res = new int[digits.length + 1];
        res[0] = 1;
        return res;
    }
}
  • Approach: Increment from end; handle carry-overflow.
  • Dry run 1 (digits=[1,2,3]): i=2 → 3<9 → set 4 and return [1,2,4]
  • Dry run 2 (digits=[9,9,9]): i=2→0, i=1→0, i=0→0 → new array [1,0,0,0]

Move Zeroes (LeetCode 283)

class Solution {
    public void moveZeroes(int[] nums) {
        int insertPos = 0;
        for (int num : nums) {
            if (num != 0) {
                nums[insertPos++] = num;
            }
        }
        while (insertPos < nums.length) {
            nums[insertPos++] = 0;
        }
    }
}
  • Approach: Compact non-zeros then fill the rest with zeros.
  • Dry run (nums=[0,1,0,3,12]):
    • First pass writes 1,3,12 to positions 0..2 → insertPos=3
    • Fill positions 3..4 with 0 → [1,3,12,0,0]

Majority Element (LeetCode 169)

class Solution {
    public int majorityElement(int[] nums) {
        int count = 0, candidate = 0;
        for (int num : nums) {
            if (count == 0) candidate = num;
            count += (num == candidate) ? 1 : -1;
        }
        return candidate;
    }
}
  • Approach: Boyer-Moore Voting.
  • Dry run (nums=[3,2,3]):
    • count=0 → candidate=3, count=1
    • num=2 → count=0
    • count=0 → candidate=3, count=1 → answer=3

Neighbors Are Greater (Circular)

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] A = new int[N];
        for (int i = 0; i < N; i++) A[i] = sc.nextInt();
        for (int i = 0; i < N; i++) {
            int count = 0;
            if (A[(i - 1 + N) % N] > A[i]) count++;
            if (A[(i + 1) % N] > A[i]) count++;
            System.out.print(count + " ");
        }
    }
}
  • Dry run (N=5, A=[3,6,1,4,2]):
    • i=0: left=A[4]=2>3? no; right=A[1]=6>3? yes → 1
    • i=1: left=3>6? no; right=1>6? no → 0
    • i=2: left=6>1? yes; right=4>1? yes → 2
    • i=3: left=1>4? no; right=2>4? no → 0
    • i=4: left=4>2? yes; right=3>2? yes → 2
    • Output: 1 0 2 0 2

Largest Perimeter Triangle (LeetCode 976)

import java.util.*;

class Solution {
    public int largestPerimeter(int[] nums) {
        Arrays.sort(nums);
        for (int i = nums.length - 1; i >= 2; i--) {
            if (nums[i - 1] + nums[i - 2] > nums[i]) {
                return nums[i - 1] + nums[i - 2] + nums[i];
            }
        }
        return 0;
    }
}
  • Approach: Sort; check triangle inequality from largest side.
  • Dry run (nums=[2,1,2]): sort→[1,2,2], check 2+1>2 → true → perimeter=5