Longest subarray whose elements form a continuous sequence

后端 未结 7 849
没有蜡笔的小新
没有蜡笔的小新 2021-01-31 05:52

Given an unsorted array of positive integers, find the length of the longest subarray whose elements when sorted are continuous. Can you think of an O(n) solution?

Examp

7条回答
  •  清酒与你
    2021-01-31 06:24

    This will require two passes over the data. First create a hash map, mapping ints to bools. I updated my algorithm to not use map, from the STL, which I'm positive uses sorting internally. This algorithm uses hashing, and can be easily updated for any maximum or minimum combination, even potentially all possible values an integer can obtain.

    #include 
    
    using namespace std;
    const int MINIMUM = 0;
    const int MAXIMUM = 100;
    const unsigned int ARRAY_SIZE = MAXIMUM - MINIMUM;
    
    int main() {
    
    bool* hashOfIntegers = new bool[ARRAY_SIZE];
    //const int someArrayOfIntegers[] = {10, 9, 8, 6, 5, 3, 1, 4, 2, 8, 7};
    //const int someArrayOfIntegers[] = {10, 6, 5, 3, 1, 4, 2, 8, 7};
    const int someArrayOfIntegers[] = {-2, -3, 8, 6, 12, 14,  4, 0, 16, 18, 20};
    const int SIZE_OF_ARRAY = 11;
    
    //Initialize hashOfIntegers values to false, probably unnecessary but good practice.
    for(unsigned int i = 0; i < ARRAY_SIZE; i++) {
        hashOfIntegers[i] = false;
    }
    
    //Chage appropriate values to true.
    for(int i = 0; i < SIZE_OF_ARRAY; i++) {
        //We subtract the MINIMUM value to normalize the MINIMUM value to a zero index for negative numbers.
        hashOfIntegers[someArrayOfIntegers[i] - MINIMUM] = true;
    }
    
    int sequence = 0;
    int maxSequence = 0;
    //Find the maximum sequence in the values
    for(unsigned int i = 0; i < ARRAY_SIZE; i++) {
    
        if(hashOfIntegers[i]) sequence++;
        else sequence = 0;
    
        if(sequence > maxSequence) maxSequence = sequence;
    }
    
    cout << "MAX SEQUENCE: " << maxSequence << endl;
    return 0;
    }
    

    The basic idea is to use the hash map as a bucket sort, so that you only have to do two passes over the data. This algorithm is O(2n), which in turn is O(n)

提交回复
热议问题