Post

leetcode(리트코드)16-3Sum Closest

leetcode(리트코드)16-3Sum Closest

leetcode 16 - 3Sum Closest 문제입니다.

1. 문제

https://leetcode.com/problems/3sum-closest/


2. Input , Output


3. 분류 및 난이도

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


4. 문제 해석

  • 들어온 벡터에서 3개의 요소를 더한 값이 최대한 target과 비슷한 것을 찾아 리턴합니다.

5. code

c++

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
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        //tiem out
        int res = 0;
        int min = INT_MAX;
        for(int i = 0 ; i<nums.size()-2;++i){
            int sum = nums[i];
            for(int j = i+1; j< nums.size()-1; ++j){
                sum += nums[j];
                for(int k = j+1; k< nums.size();++k){
                    sum+=nums[k];
                    int temp = target-sum;
                    if(abs(min) > abs(temp))
                    {
                        min = temp;
                        res = sum;
                    }
                        
                    sum-=nums[k];
            }
                sum-=nums[j];
        }
    }
        return res;
    }
};

6. 결과 및 후기, 개선점

c++ 5%

개선한 0ms code 100%

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
class Solution {
 public:
  int threeSumClosest(vector<int>& v, int target) {
    sort(v.begin(), v.end());
    int res = v[0] + v[1] + v[2];

    int n = v.size();
    for (int i = 0; i < n - 2; i++) {
        //k는 끝에서부터 검사
      for (int j = i + 1, k = n - 1; j < k;) {
        int curr = v[i] + v[j] + v[k];
        if (abs(curr - target) < abs(res - target)) res = curr;

        if (curr - target == 0)
          return curr;
        else if (curr - target > 0)
          k--;
        else
          j++;
      }
    }

    return res;
  }
};

저의 코드인 for문을 3개쓴 O(n^3)에 비해 for문을 2개 쓰고 그 하나도 투 포인트탐색을 하므로 O(n^2)의 시간복잡도를 갖습니다.

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