给你一个长度为 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
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注意:不能使用三次循环暴力求解,会超时
标签:排序和双指针
本题目因为要计算三个数,如果靠暴力枚举的话时间复杂度会到 O(n3)O(n^3)O(n3),需要降低时间复杂度
首先进行数组排序,时间复杂度 O(nlogn)O(nlogn)O(nlogn)
在数组 nums 中,进行遍历,每遍历一个值利用其下标i,形成一个固定值 nums[i]
再使用前指针指向 start = i + 1 处,后指针指向 end = nums.length - 1 处,也就是结尾处
根据 sum = nums[i] + nums[start] + nums[end] 的结果,判断 sum 与目标 target 的距离,如果更近则更新结果 ans
同时判断 sum 与 target 的大小关系,因为数组有序,如果 sum > target 则 end--,如果 sum < target 则 start++,如果 sum == target 则说明距离为 0 直接返回结果
整个遍历过程,固定值为 n 次,双指针为 n 次,时间复杂度为 O(n2)O(n^2)O(n2)
总时间复杂度:O(nlogn)+O(n2)=O(n2)O(nlogn) + O(n^2) = O(n^2)O(nlogn)+O(n2)=O(n2)
作者:guanpengchn
链接:https://leetcode.cn/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- class Solution {
- public:
- int threeSumClosest(vector<int>& nums, int target) {
- int n=nums.size();
-
- sort(nums.begin(),nums.end());
- int L,R,res=nums[0]+nums[1]+nums[2],temp;
- for(int i=0;i
-1;i++){ - L=i+1;
- R=n-1;
- while(L
- temp=nums[i]+nums[L]+nums[R];
- if(abs(temp-target)<abs(res-target)){
- res=temp;
- }
- if(temp
- L++;
- }else if(temp>target){
- R--;
- }else{
- return res;
- }
- }
- }
- return res;
- }
- };
-
相关阅读:
虚幻阴影整理
hot100----字串
FastAPI 学习之路(三十三)操作数据库
PPT 生成整数序列字典序的r-组合算法
Vue(四)——全局事件总线, 消息订阅与发布 ,nextTick
Python+requests+pytest+excel+allure 接口自动化测试实战
Last Week in Milvus
社交媒体用户行为研究,图神经网络 社交网络
基于单片机的智能交通灯控制系统设计
Springboot旅游网的设计与实现xb29f计算机毕业设计-课程设计-期末作业-毕设程序代做
-
原文地址:https://blog.csdn.net/qq_39993896/article/details/126915064