Find the Power of K-Size Subarrays I

Updated on 30 May, 2025
Find the Power of K-Size Subarrays I header image

Problem Statement

In this problem, you are provided with an integer array nums of length n and a positive integer k. The task is to determine the power of all possible contiguous subarrays of nums with length k. The power of an array is uniquely defined based on the sequence and ordering of its elements:

  • The power of an array is its maximum element if all its elements are consecutive numbers sorted in ascending order.
  • If the elements are not consecutive or not sorted in ascending order, the power is -1.

The output should be an array results such that results[i] represents the power of the subarray starting from index i and ending at index i + k - 1. This problem challenges you to assess and deduce the sequence composition while keeping an eye on continuous subarray chunks of a given size.

Examples

Example 1

Input:

nums = [1,2,3,4,3,2,5], k = 3

Output:

[3,4,-1,-1,-1]

Explanation:

There are 5 subarrays of `nums` of size 3:
- [1, 2, 3] → consecutive and ascending → power = 3
- [2, 3, 4] → consecutive and ascending → power = 4
- [3, 4, 3] → not consecutive → power = -1
- [4, 3, 2] → not sorted ascending → power = -1
- [3, 2, 5] → not consecutive → power = -1

Example 2

Input:

nums = [2,2,2,2,2], k = 4

Output:

[-1,-1]

Example 3

Input:

nums = [3,2,3,2,3,2], k = 2

Output:

[-1,3,-1,3,-1]

Explanation:

- [3,2] → not ascending → power = -1
- [2,3] → consecutive and ascending → power = 3
- [3,2] → not ascending → power = -1
- [2,3] → consecutive and ascending → power = 3
- [3,2] → not ascending → power = -1

Constraints

  • 1 <= n == nums.length <= 500
  • 1 <= nums[i] <= 10^5
  • 1 <= k <= n

Approach and Intuition

Step-by-step process to solve the problem:

  1. Initialize an empty list results to store the power of each subarray of size k.

  2. Iterate through the main list nums and for each index i from 0 to n - k, perform:

    • Extract the subarray sub = nums[i : i + k].

    • Sort sub and check if each adjacent pair of elements has a difference of 1.

    • If the subarray is consecutive and sorted:

      • Append the maximum element of sub to results.
    • Otherwise:

      • Append -1 to results.

Intuition behind the solution:

  • For a subarray to have a valid "power", its elements must be strictly consecutive and sorted in ascending order.
  • Sorting and checking adjacent differences is a simple and reliable way to verify both conditions.
  • Since n <= 500, this O(n * k log k) approach is acceptable, even with a nested loop and sorting inside each window.
  • Special case: k = 1 — any single number is trivially consecutive and ascending, so its power is the number itself.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    vector<int> consecutiveArray(vector<int>& data, int target) {
        if (target == 1) {
            return data;  // Return original data if target is 1
        }

        size_t dataSize = data.size();
        vector<int> output(dataSize - target + 1, -1);  // Prepopulated output array
        int countConsecutive = 1;  // Track consecutive numbers

        for (size_t i = 0; i < dataSize - 1; ++i) {
            if (data[i] + 1 == data[i + 1]) {
                countConsecutive++;
            } else {
                countConsecutive = 1;  // Reset when the sequence breaks
            }

            // Store the last element of valid segment if the segment is long enough
            if (countConsecutive >= target) {
                output[i - target + 2] = data[i + 1];
            }
        }

        return output;
    }
};

Explore the solution for finding the power of K-size subarrays using the C++ language. The provided C++ code defines a method within a class Solution that calculates an array of last elements from consecutive numerically increasing subsequences of a given length target in the input array data.

  • Define a vector output with a default value of -1. This vector will store the last elements of valid consecutive segments of the required length.
  • Implement a loop to iterate through the array data. During each iteration, check if the current element and the next element form a consecutive sequence.
  • Use a counter countConsecutive to keep track of how many consecutive elements you encounter.
  • When a break in consecutive elements occurs, reset countConsecutive.
  • If countConsecutive reaches the value of target, update the output vector at the required position with the current element of the array.

The code handles a special case where if the target is 1, it simply returns the original data vector, as every element is a valid segment by itself. The primary algorithm focuses on tracking segments of consecutive numbers and ensuring that only segments with length equal to or greater than target are considered. This efficient method of finding and recording the last element of valid segments provides a direct approach to solving the problem.

java
class Solution {

    public int[] calculateSubarray(int[] elements, int n) {
        if (n == 1) {
            return elements; // Return the original elements if n is 1
        }

        int size = elements.length;
        int[] output = new int[size - n + 1];
        Arrays.fill(output, -1); // Set default values as -1
        int countConsecutive = 1; // Initialize count of consecutive numbers

        for (int i = 0; i < size - 1; i++) {
            if (elements[i] + 1 == elements[i + 1]) {
                countConsecutive++;
            } else {
                countConsecutive = 1; // Reset the consecutive count
            }

            // Check if we reach enough consecutive numbers to update output
            if (countConsecutive >= n) {
                output[i - n + 2] = elements[i + 1];
            }
        }

        return output;
    }
}

This Java solution tackles the problem of finding the power of k-size subarrays. Here, the power of a subarray is defined by the last element of the subarray, provided the subarray consists of k consecutive integers appearing in the input array in a consecutive manner.

Step-by-step, the method works as follows:

  1. Initialization: It initializes an output array to hold the results, filling it with -1 to signify unreached conditions and also sets up a counter to track the count of consecutive numbers.

  2. Traversing the Input Array: As you traverse the elements array, the code checks if the current element is consecutive to the previous one. If true, it increments a counter, otherwise, it resets the counter.

  3. Updating the Output Array: If the counter reaches the value k, which signifies a valid k-size consecutive subarray ending at the current element, it updates the corresponding position in the output array with the last element of this subarray.

  4. Edge Case: When k = 1, the output directly returns the original array since every single element is a valid subarray by itself.

This approach effectively captures the desired output without excessive computational overhead, ensuring a linear pass through the data while utilizing straightforward conditional and assignment operations to derive the answer.

python
class Solution:
    def findResults(self, elements, x):
        if x == 1:
            return elements

        n = len(elements)
        outcomes = [-1] * (n - x + 1)
        consec_elements = 1

        for i in range(n - 1):
            if elements[i] + 1 == elements[i + 1]:
                consec_elements += 1
            else:
                consec_elements = 1

            if consec_elements >= x:
                outcomes[i - x + 2] = elements[i + 1]

        return outcomes

This solution involves finding certain subarray characteristics within an array of integers. The Python code defines a method inside a class to handle this specific process:

  • Start by analyzing if the subarray length x is 1, which simply returns the original elements array since every individual element is a subarray of size 1 in itself.
  • Initialize an array outcomes with default values of -1. The length of this array is calculated to fit the number of valid subarrays of size x that can be extracted from elements.
  • The code iterates through the elements array to assess sequences of consecutive integers. Any sequence that meets or exceeds length x contributes to an outcome:
    • Maintain a count consec_elements to track the length of current consecutive sequence.
    • Use an if-else structure to increment this count when consecutive elements are found or reset it when they aren’t.
    • When a sequence of length at least x is identified, update the outcomes array at a computed index based on current position and subarray length x. The updated value is the last element of the current valid subarray.

The method ends by returning the outcomes array, which lists elements that are the ends of identified valid subarrays, or -1 for positions where no such subarrays exist. This approach ensures an examination of linear relationships in the array with regard to a predefined subarray size x, operating with a time complexity of O(n) where n is the number of elements. This method provides a structured way to parse through data and extract meaningful subarray-related information efficiently.

Comments

No comments yet.