Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题16最接近的三数之和
前文
本文为leetcode遍历相关题目,题目需要为16,主要考察遍历时对于效率的优化。
题目信息
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
解题思路
根据题目信息,我们需要对一个数组中找到加和最接近目标数据的三个数。直接的遍历显然效率低下,因此本解法采用双指针实现效率优化。首先对于给定的目标数组进行排序操作,这样可以方便后续的双指针处理。而我们采取的思路是由于有三个元素,第一个元素进行遍历即可。指定两个指针标记为,分别为p和q。p、q初始时分别位于循环的下一位以及队列末尾。循环时对于数据和与目标数据进行比较,如果达到目标数据,则直接返回结果。反之,与当前存储的数据比较,保留距离更小的一个。当三者和小于目标值时,移动p指针,而大于目标值则移动q指针。以此方式循环即可最终得到距离最近的三数之和。
解题代码
public int threeSumClosest(int[] nums, int target) {
nums = Arrays.stream(nums).sorted().toArray();
int result = Integer.MAX_VALUE;
if(nums.length <= 3){
int temp = 0;
for (int i = 0; i < nums.length; i++) {
temp += nums[i];
}
return temp;
}
int temp = Integer.MAX_VALUE;
for (int i = 0; i < nums.length - 2; i++) {
int p = i + 1;
int q = nums.length - 1;
if(result == Integer.MAX_VALUE){
result = nums[0] + nums[p] + nums[q];
}
if(nums[i] == temp){
continue;
}
while (true){
if(p >= q){
break;
}
if(nums[i] + nums[p] + nums[q] == target){
result = target;
break;
}else if(nums[i] + nums[p] + nums[q]< target){
result = Math.abs(result - target) < Math.abs(nums[i] + nums[p] + nums[q] - target) ? result : nums[i] + nums[p] + nums[q];
p++;
}else{
result = Math.abs(result - target) < Math.abs(nums[i] + nums[p] + nums[q] - target) ? result : nums[i] + nums[p] + nums[q];
q--;
}
}
temp = nums[i];
}
return result;
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。