Make Sum Divisible by P

Medium
Watch on YouTube ↗

Solution

class Solution {
    public int minSubarray(int[] nums, int p) {
        
        int n = nums.length;

        // base case
        // sum%p = 0 // return 0

        int sum = 0;
        for(int num : nums) {
            sum = (sum + num)%p;
        }

        int rem = sum%p;
        if(rem==0)
            return 0;
        
        // prefix[L]%p = prefix[R]%p - rem;

        HashMap<Integer, Integer> hmap = new HashMap<>();

        hmap.put(0, -1);

        int currsum = 0;
        int minlen = nums.length;

        for(int i=0; i<nums.length; i++) {
            currsum = (currsum + nums[i])%p;

            // prefix[R]%p - rem;
            int val = (currsum - rem + p)%p;

            if(hmap.containsKey(val)) {
                minlen = Math.min(minlen, i-hmap.get(val));
            }

            hmap.put(currsum, i);
            
        }

        return minlen==nums.length ? -1 : minlen;


    }
}