1. 程式人生 > >16.最接近的三數之和(3Sum Closest)

16.最接近的三數之和(3Sum Closest)

題目描述

      給定一個包括 n 個整數的陣列 S,找出 S 中的三個整數使得他們的和與給定的數 target 最接近。返回這三個數的和。

      假定每組輸入只存在一個答案。

例如,給定陣列 S = {-1 2 1 -4}, 並且 target = 1.

與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).

解題思路

1.檢查陣列的大小是否符合我們的要求;

2.對陣列進行排序,便於後面比較;

3.定義三個指標,分別指向當前位置i,當前位置的下一個位置start以及最後一個位置end;

4.每次計算i,start,end的和,並與target進行比較,並更新最終結果值result;

   如果<target,這說明太小了,就讓start往右移;

   如果>target,這說明太大了,就讓end往左移;

public int threeSumClosest(int[] num, int target) {
        if (num.length < 3) return 0;    //數字的個數小於3個,直接返回0
        Arrays.sort(num);  //從小到大排序

        int result = num[0] + num[1] + num[num.length - 1];

        for (int i = 0; i < num.length - 2; i++) {
            //三個指標,分別指向當前位置,下一個位置和最後那個位置
            int start = i + 1, end = num.length - 1;
            while (start < end) {
                int sum = num[i] + num[start] + num[end];
                if (sum > target) {
                    //目前的和大於target,必須讓end往左移
                    end--;
                } else {
                    //目前的和小於target,必須讓start往右移
                    start++;
                }
                if (Math.abs(sum - target) < Math.abs(result - target)) {
                    result = sum;   //更新result
                }
            }
        }
        return result;
}

時間複雜度為O(n*n)