Post

leetcode(리트코드)4-Meedian of Two Sorted Arrays

leetcode 4 - Median of Two Sorted Arrays 문제입니다.

1. 문제

https://leetcode.com/problems/median-of-two-sorted-arrays/


2. Input , Output


3. 분류 및 난이도

Hard 난이도 문제입니다.
leetcode Top 100 Liked의 문제입니다.


4. 문제 해석

  • 이미 정렬된 2개의 배열을 Merge Sort를 합니다. Sort를한 결과의 mid값을 리턴합니다. 만약 배열의 크기가 짝수인 경우 mid-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
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        //n과 m은 들어온 배열의 크기
        int n = nums1.size();
        int m = nums2.size();
        int mid = (n+m)/2;
        //check는 배열의 총 크기가 짝수인 경우, 홀수인 경우 판단을 위해 넣었습니다.
        bool check = (n+m)%2;
        double result = 0;
        vector<int> vec;
        int i = 0;
        int j = 0;
        //병합정렬
        while(i<n && j<m)
        {
            //mid+1까지만 정렬하면 됩ㄴ디ㅏ.
            if(vec.size()==mid+1)
                break;
            if(nums1[i] < nums2[j])
                vec.push_back(nums1[i++]);
            else
                vec.push_back(nums2[j++]);
        }
        int tmp = i > m ? j : i;
        while(i<n&& vec.size()!=mid+1)
        {
            vec.push_back(nums1[i++]);
        }
        while(j<m&&  vec.size()!=mid+1)
            vec.push_back(nums2[j++]);
        //만약 배열의 총 크기가 짝수면
        if(!check)
        {
            return (vec[mid] + vec[mid-1])/2.0;
        }
        return vec[mid];
    }
};

6. 결과 및 후기, 개선점

시간(86%)

시간이 빠른 코드(12ms) 99%

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
class Solution {
public:
    double findMedianSortedArrays(vector<int>& a1, vector<int>& a2) {
        int n1 = a1.size(), n2 = a2.size();
        if(n1 == 0 && n2 == 0)
            return 0;
        vector<int> v(n1+n2);
        int i1=0,i2=0,k=0;
        while(i1<n1 && i2<n2){
            if(a1[i1] < a2[i2]){
                v[k++] =  a1[i1++];
            }
            else{
                v[k++] =  a2[i2++];
            }
        }
        while(i1<n1){
            v[k++] =  a1[i1++];
        }
        while(i2<n2){
            v[k++] =  a2[i2++];
        }
        if((n1+n2) %2 == 0){
            int i = (n1+n2)/2,
            j = (n1+n2)/2 -1;
            return (v[i] + v[j])/2.0;
        }
        else{
            return v[(n1+n2)/2];
        }
    }
};

로직은 저와 똑같고 저와달리 배열의 끝까지 합병한다는 점에서 시간이 더 들거라 생각했습니다.

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