菜鸡每日一题系列打卡16天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个包括n个整数的数组nums和 一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
给定数组nums = [-1,2,1,-4],和target = 1。
与target最接近的三个数的和为2。(-1 + 2 + 1 = 2)。
题目分析
本题和上一题非常类似,都可以采用双指针的技巧进行解决,以降低时间复杂度。只要先对数组进行排序,然后在使用双指针扫描的同时,不断与target进行比较,以更新最接近target的值。
代码实现
class Solution {
public int threeSumClosest(int[] nums, int target) {
// 数组排序
Arrays.sort(nums);
// 初始化结果变量
int result = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length; i++) {
// 首指针起始位置
int start = i + 1;
// 尾指针起始位置
int end = nums.length - 1;
while (start < end) {
int tmp = nums[i] + nums[start] + nums[end];
if (tmp == target) {
return target;
}
// 首指针移动
else if (tmp < target) {
start++;
}
// 尾指针移动
else {
end--;
}
// 更新结果
if (Math.abs(tmp - target) < Math.abs(result - target)) {
result = tmp;
}
}
}
// 返回结果
return result;
}
}
代码分析
对代码进行分析,在针对每个数组中的元素进行循环的时候,使用双指针扫描数组中排在当前元素后面的元素,因此,时间复杂度为O(n^2),就空间而言,仅仅使用了常数大小的空间,因此,空间复杂度为O(1)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到