Skip to main content
Back to problems
#2143
Hard Algorithms

Choose numbers from two arrays in range

Array Dynamic Programming
53.0% acceptance
Mar 31, 2026
41
5

No description available.

Solution

Rust
Time O(n²)
Space O(n)
LeetCode
solution.rs
use std::collections::HashMap;

impl Solution {
  pub fn count_subranges(nums1: Vec<i32>, nums2: Vec<i32>) -> i32 {
    const MOD: i64 = 1_000_000_007;
    let n = nums1.len();
    let mut ans: i64 = 0;

    // For each starting index, extend to the right tracking diff = sum1 - sum2.
    // At each position i, pick nums1[i] (add to sum1) or nums2[i] (add to sum2).
    // We want diff == 0.
    // Use DP with HashMap on diff.
    // dp[diff] = number of ways to reach this diff for subarrays ending at current position.
    
    let mut dp: HashMap<i32, i64> = HashMap::new();
    
    for i in 0..n {
      let mut new_dp: HashMap<i32, i64> = HashMap::new();
      // Start a new subarray at i
      *new_dp.entry(nums1[i]).or_insert(0) += 1;
      *new_dp.entry(-nums2[i]).or_insert(0) += 1;
      
      // Extend existing subarrays
      for (&diff, &cnt) in &dp {
        // Pick nums1[i]
        *new_dp.entry(diff + nums1[i]).or_insert(0) = 
          (new_dp.get(&(diff + nums1[i])).unwrap_or(&0) + cnt) % MOD;
        // Pick nums2[i]
        *new_dp.entry(diff - nums2[i]).or_insert(0) = 
          (new_dp.get(&(diff - nums2[i])).unwrap_or(&0) + cnt) % MOD;
      }
      
      ans = (ans + new_dp.get(&0).unwrap_or(&0)) % MOD;
      dp = new_dp;
    }

    ans as i32
  }
}