美文网首页
LeetCode #128 Longest Consecutiv

LeetCode #128 Longest Consecutiv

作者: 刘煌旭 | 来源:发表于2020-12-18 15:31 被阅读0次
Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence.

Follow up: Could you implement the O(n) solution? 

 

Example 1:

Input: nums = [100,4,200,1,3,2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.
Example 2:

Input: nums = [0,3,7,2,5,8,4,6,0,1]
Output: 9
 

Constraints:

0 <= nums.length <= 104
-109 <= nums[i] <= 109
/**
* Abstract: This solution's based on the idea of hashing:
* for every element a[i], we bidirectionally construct the consecutive
* sequence by:
* 1) checking the presences of a[i] + 1, a[i] + 2..., and then
* 2) checking the presences of a[i] - 1, a[i] - 2...
* during which, we zero out the flags for every element checked thus
* sparing us the duplicate checking for the elements in the same 
* sequence.
* NOTE: The hash map SeparateChainingHashST type is given at the end of this article,
* which is implemented, as implied by its name, as a symbol table with hash using 
* separate chaining collision resolution.
* 
*/
#define PRIME 21089
int longestConsecutive(int* nums, int numsSize){
    if (numsSize == 0) return 0;
    int *a = nums, n = numsSize;
    SeparateChainingHashST flags = CreateSeparateChainingHashST(PRIME);
    int max = INT_MAX, min = INT_MIN;
    for (int i = 0; i < n; i++) { SetSCHST(flags, *(a + i), true); }
    int len = 1, tlen = 0, ai, t;
    for (int i = 0; i < n; i++) {
        ai = *(a + i);
        if (GetSCHST(flags, ai)) {
            SetSCHST(flags, ai, false);
            tlen = 1;
            t = ai + 1;
            while (GetSCHST(flags, t)) {
                SetSCHST(flags, t, false);
                tlen++;
                t++;
            } 
            t = ai - 1;
            while (GetSCHST(flags, t)) {
                SetSCHST(flags, t, false);
                tlen++;
                t--;
            } 
            if (len < tlen) { len = tlen; }
        }
    }
    return len;
}
/**
* Abstract: A hash map, use separate chaining to resolve hash collisions.
* Reference: Algorithms, 4ed, by R. Sedgewick & Kevin Wayne
*/
typedef int Key;
typedef bool Value;
typedef struct Node {
    Value val;
    Key key;
    struct Node *next;
}*NodePtr;
typedef NodePtr SequentialSearchST;

/**
* Support set key/value to a empty list(NULL), under which circumstance a new 
* list's returned.
*/
SequentialSearchST SetSSST(SequentialSearchST st, Key key, Value val) {
    struct Node *node = st;
    while (node != NULL) {
        if (node->key == key) {
            node->val = val;
            return st;
        }
        node = node->next;
    }
    node = (struct Node*)malloc(sizeof*node);
    node->key = key;
    node->val = val;
    node->next = st;
    return node;
}

/**
 * Return 0 for empty list(NULL) and absent keys.
*/
int GetSSST(SequentialSearchST st, Key key) {
    struct Node *node = st;
    while (node != NULL) {
        if (node->key == key) { return node->val; }
        node = node->next;
    }
    return 0;
}

SequentialSearchST RemoveSSST(SequentialSearchST st, Key key) {
    if (st == NULL) return NULL;
    struct Node *node = st;
    if (node->key == key) {
        st = node->next;
        free(node);
        return st;
    }
    struct Node *next = st->next;
    while (next != NULL) {
        if (next->key == key) {
            node->next = next->next;
            free(next);
            return st;
        }
        node = next;
        next = node->next;
    }
    return st;
}

typedef struct SeparateChainingHashSTStruct {
    int M;
    SequentialSearchST *st;
}* SeparateChainingHashST;

int Hash(Key key, int M) { return key < 0 ? -key % M : key % M; }

SeparateChainingHashST CreateSeparateChainingHashST(int M) {
    SeparateChainingHashST hst = (SeparateChainingHashST)malloc(sizeof(*hst));
    hst->M = M;
    hst->st = (SequentialSearchST*)malloc(M * sizeof(*(hst->st)));
    for (int i = 0; i < M; i++) { hst->st[i] = NULL; }
    return hst;
}

void SetSCHST(SeparateChainingHashST hst, Key key, Value val) { 
    int hash = Hash(key, hst->M);
    hst->st[hash] = SetSSST(hst->st[hash], key, val); 
}

int GetSCHST(SeparateChainingHashST hst, Key key) { return GetSSST(hst->st[Hash(key, hst->M)], key); }

void RemoveSCHST(SeparateChainingHashST hst, Key key) {
    int hash = Hash(key, hst->M);
    hst->st[hash] = RemoveSSST(hst->st[hash], key);
}

相关文章

网友评论

      本文标题:LeetCode #128 Longest Consecutiv

      本文链接:https://www.haomeiwen.com/subject/obzxnktx.html