Problem Sets on Sliding Window

This post contains a couple of well-defined problems solved via sliding window approach.

Minimum Swaps to Group All 1’s Together (3675):

    int countOccurance(vector<int> &arr, int val){
        int count = 0;
        for(int &elem : arr){
            if(elem == val){
                count++;
            }
        }
        return count;
    }
    
    int swapCount(vector<int> &arr){
        int windowSize = countOccurance(arr,1);

        int count1=0;
        for(int i=0;i<windowSize;i++){
            if(arr[i]==1){
                count1++;
            }
        }
        int minSwap=windowSize-count1;
        // cout<<"arr len"<<arr.size()<<" count1:"<<count1<<endl;
        for(int i=windowSize;i<arr.size();i++){
            // cout<<"index:"<<i<<" count:"<<count1<<endl;
            minSwap = min(minSwap, windowSize-count1);
            if(arr[i-windowSize]==1){
                count1--;
            }
            if(arr[i]==1){
                count1++;
            }
        }
        return minSwap;
    }

    int minSwaps(vector<int> &arr) {
        // write your code here
        return swapCount(arr);
    }

Max Consecutive Ones III (3811):

    int longestOnes(vector<int> &nums, int k) {
        // write your code here
        int swapsAvail = k;
        int currCount=0, maxCount=0;
        int start=0, end=0;
        for(end=0; end<nums.size();end++){
            if(nums[end]==1){
                currCount = end-start+1;
            } else if(nums[end]==0 && swapsAvail>0){
                swapsAvail--;
                currCount = end-start+1;
            } else {
                while(nums[start]!=0){
                    start++;
                }
                start++;
                currCount = end-start+1;
            }
            // cout<<start<<","<<end<<","<<currCount<<endl;
            maxCount = max(maxCount, currCount);
        }
        return maxCount;
    }

Subarray Product Less Than K (1075):

    int numSubarrayProductLessThanK(vector<int> &nums, int k) {
        // Write your code here
        int start=0, end=0;
        int count=0;
        long long int currVal = 1;
        for(end=0;end<nums.size();end++){
            long long int prevVal = currVal;
            currVal *= nums[end];
            while(currVal>=k && start<end){
                if(prevVal < k){
                    count += (end-start);
                }
                if(currVal != 0){
                    currVal /= nums[start];
                }
                start++;
            }
            // cout<<start<<","<<end<<":"<<currVal<<","<<count<<endl;
        }
        while(start<=end && currVal<k){
            count += (end-start);
            start++;
        }
        return count;
    }

Number of Equal Count Substrings (3751):

    int numSubarrayProductLessThanK(vector<int> &nums, int k) {
        // Write your code here
        int start=0, end=0;
        int count=0;
        long long int currVal = 1;
        for(end=0;end<nums.size();end++){
            long long int prevVal = currVal;
            currVal *= nums[end];
            while(currVal>=k && start<end){
                if(prevVal < k){
                    count += (end-start);
                }
                if(currVal != 0){
                    currVal /= nums[start];
                }
                start++;
            }
            // cout<<start<<","<<end<<":"<<currVal<<","<<count<<endl;
        }
        while(start<=end && currVal<k){
            count += (end-start);
            start++;
        }
        return count;
    }

Longest Nice Subarray (3603):

    vector<int> convertToBinary(int val){
        vector<int> array(64, 0);
        int index=0;
        while(val>0){
            array[index] = (val & 1);
            val >>= 1;
            index++;
        }
        return array;
    }

    int longestNiceSubarray(vector<int> &nums) {
        // --- write your code here ---
        int maxLen = 0;
        for(int end=0;end<nums.size();end++){
            vector<int> digitCountArray(64, 0);
            for(int start=end;start>=0;start--){
                vector<int> binArray = convertToBinary(nums[start]);
                bool isEntryValid = true;
                for(int i=0;i<64;i++){
                    if(binArray[i]>0 && digitCountArray[i]>0){
                        isEntryValid = false;
                        break;
                    }
                }
                if(!isEntryValid){
                    break;
                }
                // cout<<"valid: "<<start<<","<<end<<endl;
                for(int i=0;i<64;i++){
                    digitCountArray[i] +=  binArray[i];
                }
                maxLen = max(maxLen, end-start+1);
            }
        }
        return maxLen;
    }
Written on July 14, 2025