leetcode16 最接近的三数之和
做了几周的hard之后,这道题居然轻易就解出来了,稍微debug了一下就ac了,算是有了一丢丢提高把;
思路
这道题因为和三数之和很像,所以充分利用双指针的思想;先排序,然后再固定一个数i,i取值从【0,n-i】,
然后对r=i+1,l=n-1利用双指针来找最近的数
下面是直接应用abs 和sort库函数的代码,头文件 < algorithm > or <bits/stdc++.h>
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
//time O(n^2), space O(1);
int n=nums.size();
if(n<3) return -1;
int res=nums[0]+nums[1]+nums[2];
sort(nums.begin(),nums.end());
for(int i=0;i<=n-3;i++){
int l=i+1,r=n-1;
while(l<r){
int tmp_sum=nums[i]+nums[l]+nums[r];
if(tmp_sum>target) r--;
else l++;
if(abs(tmp_sum-target)<abs(res-target)) res=tmp_sum;
}
}
return res;
}
};
自己写快速排序qsort 和lambda表达式(在此类似于内联函数) f_abs的代码:
class Solution {
public:
void qsort(vector<int>&nums, int start, int end){
if(start>=end) return;
//partition block;
int pivot=nums[start];
int l=start,r=end;
while(l<r){
while(l<r && nums[r]>=pivot)
r--;
nums[l]=nums[r];
while(l<r && nums[l]<=pivot)
l++;
nums[r]=nums[l];
}
nums[l]=pivot;
pivot=l;
//recursion block;
qsort(nums,start,pivot-1);
qsort(nums,pivot+1,end);
}
int threeSumClosest(vector<int>& nums, int target) {
//time O(n^2), space O(1);
int n=nums.size();
if(n<3) return -1;
int res=nums[0]+nums[1]+nums[2];
qsort(nums,0,n-1);
auto f_abs = [&](int num){return num>0?num:(-num);};
for(int i=0;i<=n-3;i++){
int l=i+1,r=n-1;
while(l<r){
int tmp_sum=nums[i]+nums[l]+nums[r];
if(tmp_sum>target) r--;
else l++;
if(f_abs(tmp_sum-target)<f_abs(res-target)) res=tmp_sum;
}
}
return res;
}
};
leetcode16 最接近的三数之和的更多相关文章
- Leetcode13. 罗马数字转整数Leetcode14. 最长公共前缀Leetcode15. 三数之和Leetcode16. 最接近的三数之和Leetcode17. 电话号码的字母组合
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,输出对应整数  while (l < r && nums[r] == nums[--r ...
- Leetcode题库——16.最接近的三数之和
@author: ZZQ @software: PyCharm @file: threeSumClosest.py @time: 2018/10/14 20:28 说明:最接近的三数之和. 给定一个包 ...
- LeetCode 16. 3Sum Closest(最接近的三数之和)
LeetCode 16. 3Sum Closest(最接近的三数之和)
- lintcode-59-最接近的三数之和
59-最接近的三数之和 给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和. 注意事项 只需要返回三元组之和,无需返回三元组本身 样例 例如 S = ...
- LeetCode:最接近的三数之和【16】
LeetCode:最接近的三数之和[16] 题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这 ...
- Java实现 LeetCode 16 最接近的三数之和
16. 最接近的三数之和 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存 ...
随机推荐
- Java BIO、NIO、AIO 基础,应用场景
Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...
- linux 下安装python2.7.13
1.下载所必要的依赖包 yum -y install python-devel openssl openssl-devel gcc sqlite sqlite-devel mysql-devel li ...
- idea自动在文件头中添加作者和创建时间
设置路径 : File -> Settings -> Editor -> File and Code Templates 定制头模板: /** * @Author: chancy * ...
- iOS AVPlayer 的使用实践
前两天在网上看到一篇博客,介绍AVPlayer的使用,但是只简单介绍了一下单个的本地文件如何播放,心血来潮,就想着做一个类似于播放器的东西,能够实现播放网络歌曲,循环播放多首音乐,下面我们来实现一下 ...
- 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题
在docker中运行第三方服务时,通常需要绑定服务端口到本地主机.但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的 ...
- 认识和学习bash
认识Bash这个Shell 查看linux下shells: [shichaogeng@study etc]$ vim /etc/shells 查看登入时取得到的shell: [shichaogeng@ ...
- Linux--磁盘检查简单介绍
系统莫名其妙的掉电或磁盘发生问题非常可能导致文件系统的错乱,文件系统若发生错乱,可以使用fsck(file system check)命令进行检查. 使用权限:root用户 选项和参数: -a:检测到 ...
- linux下操作用户相关
一.添加用户 adduser test 二.为新添加用户设置密码 passwd test 根据提示输入两次密码 三.为用户配置免密码sudo权限 配置/etc/sudoers文件即可,过程如下 chm ...
- 【Codeforces】Orz Panda Cup
大大出的题 大大经常吐槽没有人补,所以我决定做一个 A. APA of Orz Pandas 题意:给你一个包含+-*/%和()的表达式,让你把它转化成java里BigInteger的形式 大概就像这 ...
- celery的简单使用
一 安装celery #首先进行一些简单配置 pip install celery apt-get install erlang apt-get install rabbitmq-server 二 ...