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

코드설명

Two Pointer(투포인터)를 활용합니다.

 

처음에 문제를 잘못읽어서 슬라이딩 윈도우로 풀었습니다.

두번째에는, 완전탐색 방식으로 구현했습니다만, 상당히 시간이 오래걸립니다.(통과는 합니다.)

마지막으로 투포인터 방식으로 작성해보았습니다.

 

코드

정답코드3입니다. 투포인터 방식입니다.

import java.util.*;
class Solution {
    //Brute Force Time Complexity : 5^3 x 10^6
    public int threeSumClosest(int[] nums, int target) {
        int answerSum = 23001;
        Arrays.sort(nums);
        for(int i=0; i<nums.length - 2; i++){
            if(i > 0 && nums[i-1] == nums[i]) continue;
            int l1 = i;
            int l2 = i + 1;
            int r1 = nums.length - 1;

            while(l2 < r1){
                int sum = nums[l1] + nums[l2] + nums[r1];

                if(Math.abs(sum - target) < Math.abs(answerSum - target)){
                    answerSum = sum;
                    // l2 += 1; 아래 반복문과 중복되었습니다. 이 부분은 주석처리합니다.
                }

                if(sum > target){
                    r1 -= 1;
                    while(l2 < r1 && nums[r1] == nums[r1+1]) r1 -= 1;
                }else if(sum < target){
                    l2 += 1;
                    while(l2 < r1 && nums[l2] == nums[l2-1]) l2 += 1;
                }else if(sum == target){
                    return sum;
                }

            }
        }
        return answerSum;
    }
}

3중 for문을 활용한 완전탐색 방식입니다.

import java.util.*;
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int answerSum = 23001;
        for(int i=0; i<nums.length - 2; i++){
            for(int j=i+1; j<nums.length - 1; j++){
                for(int k=j+1; k<nums.length; k++){
                    int nowSum = nums[i] + nums[j] + nums[k];
                    if(Math.abs(nowSum - target) < Math.abs(answerSum - target)){
                        answerSum = nowSum;
                    }
                }
            }
        }
        
        return answerSum;
    }
}

 

처음에 잘못 작성한 코드입니다. 문제를 잘못이해해서 슬라이딩 윈도우로 처음에 잘못 풀었습니다.

import java.util.*;
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int pSum = 0;
        for(int i=0;i<2; i++){
            pSum += nums[i];
        }

        int answer = 1000 * 3 + 1;
        int answerDiff = 1000 * 3 + 1;
        for(int i=2; i<nums.length; i++){
            pSum += nums[i];
            System.out.println("target:"+target+ " pSum:"+pSum+" "+(target-pSum));
            if(Math.abs(target - pSum) < Math.abs(answerDiff)){
                answerDiff = (target - pSum);
                answer = pSum;
            }
            pSum -= nums[i - 2];
        }
        return answer;
    }
}

 

+ Recent posts