can Sort array

XXX. Can Sort Array

Greedy
Array

Problem Statement:

Given an array of integers nums, determine if it can be partitioned into segments where:

  • All numbers in a segment have the same number of set bits in their binary representation.
  • Each segment is sorted in ascending order.
  • Segments are sorted in ascending order based on their minimum values.
Return true if the array meets these conditions; otherwise, return false.

Approach:

  1. Initialize tracking variables:
    • The number of set bits for the current segment.
    • The maximum and minimum values of the current segment.
    • The maximum value of the previous segment to ensure proper ordering.
  2. Iterate through the array:
    • If the current number has the same number of set bits as the current segment, update the segment's minimum and maximum values.
    • If not, check whether the previous segment is sorted correctly relative to the current one. If not, return false.
    • Start a new segment with the current number.
  3. Perform a final check for the last segment to ensure proper ordering.
  4. Return true if all checks pass.

Java Implementation:


// Function to determine if the array can be sorted into valid segments
public boolean canSortArray(int[] nums) {
    // Number of set bits of the elements in the current segment
    int numOfSetBits = Integer.bitCount(nums[0]);
    int maxOfSegment = nums[0];
    int minOfSegment = nums[0];

    // Initialize max of the previous segment to the smallest possible integer
    int maxOfPrevSegment = Integer.MIN_VALUE;

    for (int i = 1; i < nums.length; i++) {
        if (Integer.bitCount(nums[i]) == numOfSetBits) {
            // Current number belongs to the same segment
            // Update the segment's minimum and maximum values
            maxOfSegment = Math.max(maxOfSegment, nums[i]);
            minOfSegment = Math.min(minOfSegment, nums[i]);
        } else {
            // Current number starts a new segment
            // Check if the previous segment is sorted correctly
            if (minOfSegment < maxOfPrevSegment) return false;

            // Update tracking variables for the new segment
            maxOfPrevSegment = maxOfSegment;
            maxOfSegment = nums[i];
            minOfSegment = nums[i];
            numOfSetBits = Integer.bitCount(nums[i]);
        }
    }

    // Final check to ensure the last segment is properly ordered
    if (minOfSegment < maxOfPrevSegment) return false;

    return true;
}
        

Key Insights:

  • Set Bits: Use Integer.bitCount() to calculate the number of 1s in the binary representation of a number.
  • Segment Validation: Each segment is checked for internal sorting and proper ordering relative to other segments.
  • Greedy Approach: Process each element while maintaining minimal additional data, making the solution efficient.

Complexity Analysis:

Time Complexity: O(n), where n is the size of the array.
Space Complexity: O(1), as no extra data structures are used apart from a few variables.

Previous
Previous

01 matrix

Next
Next

132 pattern