Post

leetcode(리트코드)2월4일 594-Longest Harmonious Subsequence

leetcode(리트코드)2월4일 594-Longest Harmonious Subsequence

leetcode February challenge04 - Logest Harmonious Subsequence 문제입니다.

1. 문제

https://leetcode.com/problems/longest-harmonious-subsequence/


2. Input , Output


3. 분류 및 난이도

Eazy 난이도입니다.
2월04일자 챌린지 문제입니다.


4. 문제 해석

  • 최대값과 최소값이 1이 차이가 나는 가장 긴 부분 배열을 찾고 그 길이를 리턴합니다.

5. code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
public:
    int findLHS(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        //결과
        int result =0;
        //같은 숫자를 셉니다.
        int countnumf = 1;
        //1 을 더한 숫자를 세줍니다.
        int countnums = 0;
        //위치
        int spot = nums[0];
        // 1 더한 숫자를 세주는 루프문을 한 번이라도 도는지 확인합니다.
        bool check = false;
        for(size_t i=0;i<nums.size();++i)
        {
            cout<<"i : "<<i<<'\n';
            spot = nums[i];
            //같은 값을 세줍니다.
            while(i+1<nums.size() && spot == nums[i+1])
            {
                ++countnumf;
                ++i;
            }
            spot = nums[i]+1;
            //1 더 큰 값을 세줍니다.
            while(i+1<nums.size() && spot ==nums[i+1])
            {
                check = true;
                ++countnums;
                ++i;
            }
            cout<<countnumf<<" "<<countnums<<'\n';
            if(countnums!=0)
                result = max(countnumf + countnums ,result);
            countnumf = countnums == 0 ? 1 : countnums;
            countnums = 0;
            //만약 1 더큰값을 세지 않은 경우 --i를 해줍니다. 예를 들어서 1112223라는게 있으면  2에서 3으로 넘어가버리기 때문에 --i를 통해 2로 유지해줘야합니다.
            if(check)
            {
                --i;
                check=false;
            }
            
        }
        
        return result;
    }

};

6. 결과 및 후기, 개선점

시간이 매우 느리게 나왔습니다.

이해하기 쉽고 빠른 코드(36ms)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Solution {
public:
    int findLHS(vector<int>& nums) {
        //오름차순 정렬
        sort(nums.begin(), nums.end());
        
        int max_n = 1;
        int max_n_1 = 0;
        int res = 0;

        for (int i = 1; i < nums.size(); ++i)
        {
            //만약 같은 숫자면
            if (nums[i] == nums[i - 1])
            {
                ++max_n;
            }
            else
            {
                //같은 숫자가 아닌데 밑의 if문을 한번이라도 돌았으면
                if (max_n_1 > 0)
                {
                    //결과를 넣어줍니다.
                    res = max(res, max_n + max_n_1);
                }
                //i+1 배열이 i 인덱스의 값보다 1클경우
                if (nums[i] - nums[i - 1] == 1)
                {
                    // 맨 위의 if문에서 세준 값을 넣어줍니다.
                    max_n_1 = max_n;
                }
                //그런 경우가 없을 경우 (차이가 많이남)
                else
                {
                    //아예 안돌았다는 표시
                    max_n_1 = 0;
                }
                
                max_n = 1;
            }
        }
        
        // 최대값을 구하는 if문을 한번이라도 돌았으면
        if (max_n_1 > 0)
        {
            res = max(res, max_n + max_n_1);
        }
        
        return res;
    }
};

This post is licensed under CC BY 4.0 by the author.