[LeetCode 일일질문] - 128. 가장 긴 연속 시퀀스

하나 [주제 카테고리]

  • 해시 테이블

두 가지 [질문 난이도]

  • 중간

세 [화제 번호]

  • 128. 가장 긴 연속 시퀀스

네 [제목 설명]

  • 정렬되지 않은 정수 배열 nums가 주어지면 가장 긴 연속 숫자 시퀀스의 길이를 찾습니다(시퀀스의 요소가 원래 배열에서 연속적일 필요는 없음).
  • 이 문제를 해결하기 위해 O(n) 시간 복잡도를 갖는 알고리즘을 설계하고 구현하십시오.

다섯 [주제 예]

  • 예 1:

    • 입력: 숫자 = [100,4,200,1,3,2]
    • 출력: 4
    • 설명: 연속되는 가장 긴 수열은 [1, 2, 3, 4]입니다. 길이는 4입니다.
  • 예 2:

    • 입력: 숫자 = [0,3,7,2,5,8,4,6,0,1]
    • 출력: 9

여섯 [주제 프롬프트]

  • 0 < = 숫자 . 길이 < = 1 0 5 0 <= 숫자.길이 <= 10^50<=숫자 . _ _ _ 길이 _ _ _ _ _<=1 05
  • − 1 0 9 < = 숫자 [ i ] < = 1 0 9 -10^9 <= 숫자[i] <= 10^9- 10 _9<=숫자 s [ 나는 ] _ _<=1 09

7가지 [문제 해결 아이디어]

  • 해시 테이블 사용 아이디어
  • 먼저 배열의 요소를 해시 테이블에 추가합니다. 이것의 목적은 중복을 제거하고 후속 계산을 용이하게 하는 것입니다.
  • 그런 다음 해시 테이블의 각 요소를 순회하고 이 요소에서 시작하여 연속 배열을 계산하고 해시 테이블을 스캔합니다.
  • 이렇게 하면 O(n) O(n) 만 사용합니다.이 문제를 풀기 위한 O ( n ) 시간복잡도
  • 마지막으로 결과 반환

여덟 【시간 주파수】

  • 시간 복잡도: O(n) O(n)O ( n )nnn 은 들어오는 배열의 길이입니다.
  • 공간 복잡도: O (n ) O(n)O ( n )nnn 은 들어오는 배열의 길이입니다.

나인 [코드 구현]

  1. 자바 언어 버전
class Solution {
    
    
    public int longestConsecutive(int[] nums) {
    
    
        HashSet<Integer> map = new HashSet<>();
        for(int i = 0;i < nums.length;i++){
    
    
            map.add(nums[i]);
        }
        int res = 0;
        for(int num : map){
    
    
            if(!map.contains(num - 1)){
    
    
                int curNum = num;
                int curLen = 1;
                while(map.contains(curNum + 1)){
    
    
                    curNum += 1;
                    curLen += 1;
                }
                res = Math.max(res, curLen);
            }
        }
        return res;
    }
}
  1. C 언어 버전
struct HashNode
{
    
    
    int key;
    UT_hash_handle hh;
};

int longestConsecutive(int* nums, int numsSize)
{
    
    
    struct HashNode* map = NULL;
    struct HashNode* tempNode = NULL;
    for(int i = 0;i < numsSize;i++)
    {
    
    
        HASH_FIND_INT(map, &nums[i], tempNode);
        if(tempNode == NULL)
        {
    
    
            struct HashNode* newNode = (struct HashNode*)malloc(sizeof(struct HashNode));
            newNode->key = nums[i];
            HASH_ADD_INT(map, key, newNode);
        }
    }
    struct HashNode *val, *temp;
    int res = 0;
    HASH_ITER(hh, map, val, temp)
    {
    
    
        if(val != NULL)
        {
    
    
            int lastVal = val->key - 1;
            HASH_FIND_INT(map, &lastVal, tempNode);
            if(tempNode == NULL)
            {
    
    
                int curNum = val->key + 1;
                int curLen = 1;
                HASH_FIND_INT(map, &curNum, tempNode);
                while(tempNode != NULL)
                {
    
    
                    curNum += 1;
                    curLen += 1;
                    HASH_FIND_INT(map, &curNum, tempNode);
                }
                res = fmax(res, curLen);
            }
        }
    }
    HASH_ITER(hh, map, val, temp)
    {
    
    
        HASH_DEL(map, val);
        free(val);
    }
    return res;
}
  1. 파이썬 언어 버전
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        map = set(nums)
        res = 0
        for num in map:
            if num - 1 not in map:
                curNum = num
                curLen = 1
                while curNum + 1 in map:
                    curNum += 1
                    curLen += 1
                res = max(res, curLen)
        return res
  1. C++ 언어 버전
class Solution {
    
    
public:
    int longestConsecutive(vector<int>& nums) {
    
    
        unordered_set<int> map;
        for(int i = 0;i < nums.size();i++){
    
    
            map.insert(nums[i]);
        }
        int res = 0;
        for(const int& num : map){
    
    
            if(!map.count(num - 1)){
    
    
                int curNum = num;
                int curLen = 1;
                while(map.count(curNum + 1)){
    
    
                    curNum += 1;
                    curLen += 1;
                }
                res = max(res, curLen);
            }
        }
        return res;
    }
};

텐【투고 결과】

  1. 자바 언어 버전
    여기에 이미지 설명 삽입

  2. C 언어 버전
    여기에 이미지 설명 삽입

  3. 파이썬 언어 버전
    여기에 이미지 설명 삽입

  4. C++ 언어 버전
    여기에 이미지 설명 삽입

추천

출처blog.csdn.net/IronmanJay/article/details/132226321