Skip to content

53. Maximum Subarray

Contains negative numbers, must start accumulating from nums[0]

java
class Solution {  
    public int maxSubArray(int[] nums) {  
        int res = nums[0], acc = nums[0];  
        for (int i = 1; i < nums.length; i++) {  
            acc = Math.max(acc + nums[i], nums[i]);  
            res = Math.max(res, acc);  
        }  
        return res;  
    }  
}

56. Merge Intervals

go

go
func merge(intervals [][]int) [][]int {
	var events [][2]int
	for _, interval := range intervals {
		events = append(events, [2]int{interval[0], 1})
		events = append(events, [2]int{interval[1] + 1, -1})
	}
	sort.Slice(events, func(i, j int) bool {
		return events[i][0] < events[j][0] || events[i][0] == events[j][0] && events[i][1] < events[j][1]
	})
	var result [][]int
	cover := 0
	start := -1
	for _, event := range events {
		if cover == 0 {
			start = event[0]
		}
		cover += event[1]
		if cover == 0 {
			result = append(result, []int{start, event[0] - 1})
		}
	}
	return result
}

238. Product of Array Except Self

java

java
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        res[0] = 1;
        for (int i = 1; i < n; i++)
            res[i] = res[i - 1] * nums[i - 1];
        int right = 1;
        for (int i = n - 1; i >= 0; i--) {
            res[i] *= right;
            right *= nums[i];
        }
        return res;
    }
}

307. Range Sum Query - Mutable

java

java
class NumArray {  
    int[] tree;  
    int[] a;  
    int n;  
  
    int lowBit(int x) {  
        return x & -x;  
    }  
  
    int query(int x) {  
        int ans = 0;  
        for (int i = x; i > 0; i -= lowBit(i)) ans += tree[i];  
        return ans;  
    }  
  
    void add(int x, int delta) {  
        for (int i = x; i < n + 1; i += lowBit(i)) tree[i] += delta;  
    }  
  
    public NumArray(int[] nums) {  
        a = nums;  
        n = nums.length;  
        tree = new int[n + 1];  
        for (int i = 0; i < n; i++) add(i + 1, a[i]);  
    }  
  
    public void update(int i, int val) {  
        add(i + 1, val - a[i]);  
        a[i] = val;  
    }  
  
    public int sumRange(int l, int r) {  
        return query(r + 1) - query(l);  
    }  
}

Go

Go
type NumArray struct {
	a    []int
	tree []int
	n    int
}

func Constructor(nums []int) NumArray {
	n := len(nums)
	tree := make([]int, n+1)
	for i := 0; i < n; i++ {
		add(i+1, nums[i], tree)
	}
	return NumArray{a: nums, tree: tree, n: n}
}
func add(x int, delta int, tree []int) {
	for ; x < len(tree); x += x & -x {
		tree[x] += delta
	}
}
func (t *NumArray) Update(index int, val int) {
	add(index+1, val-t.a[index], t.tree)
	t.a[index] = val
}

func (t *NumArray) SumRange(left int, right int) int {
	return query(right+1, t.tree) - query(left, t.tree)
}
func query(x int, tree []int) int {
	res := 0
	for ; x > 0; x -= x & -x {
		res += tree[x]
	}
	return res
}

523. Continuous Subarray Sum

java

java
class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        int n = nums.length;
        int runningSum = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        for (int i = 0; i < n; i++) {
            runningSum += nums[i];
            runningSum %= k;
            if (map.containsKey(runningSum)) {
                if (i - map.get(runningSum) > 1) return true;
                continue;
            }
            map.put(runningSum, i);
        }
        return false;
    }
}

go

go
func checkSubarraySum(nums []int, k int) bool {
	sum := 0
	m := make(map[int]int)
	m[0] = -1
	for i, num := range nums {
		sum += num
		sum %= k
		if _, ok := m[sum]; !ok {
			m[sum] = i
			continue
		}
		if i-m[sum] > 1 {
			return true
		}
	}
	return false
}

560. Subarray Sum Equals K

This problem cannot be solved using a standard sliding window.

java

java
class Solution {
    public int subarraySum(int[] nums, int k) {
        int res = 0, acc = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        for (int num : nums) {
            acc += num;
            res += map.getOrDefault(acc - k, 0);
            map.put(acc, map.getOrDefault(acc, 0) + 1);
        }
        return res;
    }
}

1109. Corporate Flight Bookings

java

java
class Solution {
    public int[] corpFlightBookings(int[][] bookings, int n) {
        int[] res = new int[n];
        for (int[] b : bookings) {
            res[b[0] - 1] += b[2];
            if (b[1] < n) res[b[1]] -= b[2];
        }
        for (int i = 1; i < n; i++) {
            res[i] += res[i - 1];
        }
        return res;
    }
}

1074. Number of Submatrices That Sum to Target

java

java
class Solution {  
    public int numSubmatrixSumTarget(int[][] matrix, int target) {  
        int m = matrix.length, n = matrix[0].length;  
        int[][] A = new int[m + 1][n];  
        for (int i = 0; i < m; i++) {  
            for (int j = 0; j < n; j++) {  
                A[i + 1][j] = A[i][j] + matrix[i][j];  
            }  
        }  
        int[] row = new int[n];  
        int res = 0;  
        for (int up = 0; up < m; up++) {  
            for (int down = up; down < m; down++) {  
                for (int i = 0; i < n; i++) {  
                    row[i] = A[down + 1][i] - A[up][i];  
                }  
                res += subarraySum(row, target);  
            }  
        }  
        return res;  
    }  
  
    public int subarraySum(int[] nums, int k) {  
        int res = 0, acc = 0;  
        HashMap<Integer, Integer> map = new HashMap<>();  
        map.put(0, 1);  
        for (int num : nums) {  
            acc += num;  
            res += map.getOrDefault(acc - k, 0);  
            map.put(acc, map.getOrDefault(acc, 0) + 1);  
        }  
        return res;  
    }  
}

1352. Product of the Last K Numbers

java

java
class ProductOfNumbers {
    ArrayList<Integer> list;

    public ProductOfNumbers() {
        list = new ArrayList<>(List.of(1));
    }

    public void add(int num) {
        if (num == 0) {
            list = new ArrayList<>(List.of(1));
            return;
        }
        list.add(list.get(list.size() - 1) * num);
    }

    public int getProduct(int k) {
        int n = list.size();
        return k < n ? list.get(n - 1) / list.get(n - k - 1) : 0;
    }
}