上周還在郁悶自己寫的算法由于超時沒有通過,這周就給了一個彌補的機會,難度級別“Medium”
題目:已知n個整數的數組nums,給定一個數target。數組S中任意三個數求和,找到其中最接近target的值。保證每個輸入都對應單一解。
通過上周的題再來看這道題,就很簡單了,直接代碼解說吧:
int threeSumClosest(int* nums, int numsSize, int target) {
//如果給出的數組個數少于3個,就不用比了
if (numsSize == 0) return 0;
if (numsSize == 1) return nums[0];
if (numsSize == 2) return nums[0] + nums[1];
//數據初始化,初始化的結果是前三個數字的和
int result = nums[0] + nums[1] + nums[2];
int temp = abs(result - target);
int i,j,k;
//上周我的笨算法,把所有的組合全部查一遍,找出符合要求的結果
for (i = 0; i < numsSize; i++)
for (j = i+1; j < numsSize; j++) {
if (j == i) continue;
for (k = j+1; k < numsSize; k++) {
if (k == i || k == j) continue;
if (nums[i] + nums[j] + nums[k] == target) return target;
//通過比較絕對值來找出最貼近target的數
if (abs(nums[i] + nums[j] + nums[k] - target) < temp) {
result = nums[i] + nums[j] + nums[k];
temp = abs(result - target);
}
}
}
//返回結果
return result;
}
雖然這次的算法通過了,但是效率還是比較低的,可以通過上周的思路,先排序,然后從兩邊開始找就OK了。。。