博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 3Sum Smaller 三数之和较小值
阅读量:6072 次
发布时间:2019-06-20

本文共 1794 字,大约阅读时间需要 5 分钟。

 

Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.

For example, given nums = [-2, 0, 1, 3], and target = 2.

Return 2. Because there are two triplets which sums are less than 2:

[-2, 0, 1][-2, 0, 3]

Follow up:

Could you solve it in O(n2) runtime?

 
这道题是3Sum问题的一个变形,让我们求三数之和小于一个目标值,那么最简单的方法就是穷举法,将所有的可能的三个数字的组合都遍历一遍,比较三数之和跟目标值之间的大小,小于的话则结果自增1,参见代码如下:
 
解法一:
// O(n^3)class Solution {public:    int threeSumSmaller(vector
& nums, int target) { int res = 0; sort(nums.begin(), nums.end()); for (int i = 0; i < int(nums.size() - 2); ++i) { int left = i + 1, right = nums.size() - 1, sum = target - nums[i]; for (int j = left; j <= right; ++j) { for (int k = j + 1; k <= right; ++k) { if (nums[j] + nums[k] < sum) ++res; } } } return res; }};

 

题目中的Follow up让我们在O(n^2)的时间复杂度内实现,那么我们借鉴之前那两道题和中的方法,采用双指针来做,这里面有个trick就是当判断三个数之和小于目标值时,此时结果应该加上right-left,以为数组排序了以后,如果加上num[right]小于目标值的话,那么加上一个更小的数必定也会小于目标值,然后我们将左指针右移一位,否则我们将右指针左移一位,参见代码如下:

 

解法二:

// O(n^2)class Solution {public:    int threeSumSmaller(vector
& nums, int target) { if (nums.size() < 3) return 0; int res = 0, n = nums.size(); sort(nums.begin(), nums.end()); for (int i = 0; i < n - 2; ++i) { int left = i + 1, right = n - 1; while (left < right) { if (nums[i] + nums[left] + nums[right] < target) { res += right - left; ++left; } else { --right; } } } return res; }};

 

类似题目:

 
参考资料:

 

转载地址:http://opngx.baihongyu.com/

你可能感兴趣的文章
mysql实战14 | count(*)这么慢,我该怎么办?
查看>>
wireshark的ubuntu更新ppa源
查看>>
AngularJs 学习 (二)
查看>>
0302感想
查看>>
实验四 主存空间的分配和回收
查看>>
解决eclipse之ADT与SDK版本不一致问题
查看>>
jQuery 属性操作
查看>>
小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践
查看>>
387. 字符串中的第一个唯一字符
查看>>
(转)ORA-01245错误 (2013-04-13 18:37:01)
查看>>
shiro笔记-AuthenticatingRealm和AuthorizingRealm关系
查看>>
内联网
查看>>
从键盘上连续录入一批整数,比较并输出其中的最大值和最小值,当输入数字0时结束循环...
查看>>
mysql中触发器如何监听本身并且改变本身的字段?
查看>>
VBA 高级筛选
查看>>
设置应用图标badge(徽章)
查看>>
洛谷P4891 序列
查看>>
省选前做题记录
查看>>
批量替换行首
查看>>
jenkins对接gitlab和git
查看>>