力扣题目
解题思路
java代码
力扣题目:
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。
示例 2:
输入:nums = [0,0,0], target = 1 输出:0 解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。
解题思路:
算法原理:threeSumClosest
方法使用三层循环遍历数组的所有三元组组合,计算它们的和与目标值的差值绝对值,更新最接近的和。threeSumClosest2
方法先对数组排序,然后通过双指针从两端向中间移动,根据当前三元组的和与目标值的大小关系调整指针,更新最接近的和。
思路:
threeSumClosest
:暴力枚举所有可能的三元组,计算和并与当前最接近的和比较更新。threeSumClosest2
:- 对数组排序,便于双指针操作。
- 固定一个数,然后设置两个指针在其右侧的数组两端。
- 根据当前三元组的和与目标值的大小关系移动指针。
- 不断更新最接近的和。
代码分析:
threeSumClosest
:三层循环,计算和并比较更新。threeSumClosest2
:- 排序数组。
- 外层循环固定一个数,内层使用双指针。
- 根据和与目标值的大小关系移动指针,并在合适时更新最接近的和。
时间复杂度:
threeSumClosest
:O(n³),三层循环。threeSumClosest2
:O(n²),排序复杂度为 ,双指针遍历复杂度为 ,总体为 。
空间复杂度:
- 两个方法都是 O(1),只使用了固定的几个变量,空间开销恒定。
java代码:
package org.example;
import java.util.Arrays;
public class Leetcode16 {
public static void main(String[] args) {
int[] nums = {-1, 2, 1, -4};
System.out.println(threeSumClosest2(nums, 1));
}
public static int threeSumClosest(int[] nums, int target) {
int n = nums.length;
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
int sum = nums[i] + nums[j] + nums[k];
if (Math.abs(target - sum) < Math.abs(target - ans)) {
ans = sum;
}
}
}
}
return ans;
}
// 降低时间复杂度
public static int threeSumClosest2(int[] nums, int target) {
int n = nums.length;
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < n; i++) {
int j = i + 1, k = n - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (Math.abs(target - sum) < Math.abs(target - ans)) {
ans = sum;
}
if (sum > target) {
k--;
} else {
j++;
}
if (ans == target) {
return ans;
}
}
}
return ans;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项