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.

Example:

Input: nums = [-2,0,1,3], and target = 2
Output: 2
Explanation: 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<int>& nums, int target) {
int res = ;
sort(nums.begin(), nums.end());
for (int i = ; i < int(nums.size() - ); ++i) {
int left = i + , right = nums.size() - , sum = target - nums[i];
for (int j = left; j <= right; ++j) {
for (int k = j + ; k <= right; ++k) {
if (nums[j] + nums[k] < sum) ++res;
}
}
}
return res;
}
};

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

解法二:

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

Github 同步地址:

https://github.com/grandyang/leetcode/issues/259

类似题目:

3Sum Closest

3Sum

Valid Triangle Number

Two Sum Less Than K

参考资料:

https://leetcode.com/problems/3sum-smaller/

https://leetcode.com/problems/3sum-smaller/discuss/68817/Simple-and-easy-understanding-O(n2)-JAVA-solution

https://leetcode.com/problems/3sum-smaller/discuss/68820/Accepted-and-Simple-Java-O(n2)-solution-with-detailed-explanation

最新文章

  1. cmd 下通过NTML代理访问Maven 库
  2. neutron 网络配置flat模式
  3. dll--二进制层面的复用
  4. emctl start dbconsole OC4J_dbconsole*** not found
  5. MVC-Razor引擎布局
  6. jQuery 定时局部刷新(setInterval)方法总结
  7. windows 查 mac
  8. eclipse中集成svn maven开发手册---maven编译打包
  9. Redux源码分析之基本概念
  10. 2016/12/21 dplの课练
  11. android ninja【转】
  12. 【逆向工具】使用x64dbg+spy去除WinRAR5.40(64位)广告弹框
  13. Spring boot设置文件上传大小限制
  14. weblogic安装教程(以weblogic 11g为例)
  15. 爬虫--Scrapy-基于RedisSpider实现的分布式爬虫
  16. 20155306 2006-2007-2 《Java程序设计》第4周学习总结
  17. Sorting a Three-Valued Sequence(三值排序)
  18. Linux下程序的机器级表示学习心得
  19. mysql双机互相备份
  20. html5 canvas绘制矩形和圆形

热门文章

  1. 读书笔记--SQL必知必会02--检索数据
  2. .NET 垃圾回收与内存泄漏
  3. Aspose.Cells导出Excel(1)
  4. C#开发微信门户及应用(12)-使用语音处理
  5. yii框架安装心得
  6. Java之多态(一)
  7. DarkTrack 4 Alien Version Released RAT 下载地址&amp;视频教程
  8. iOS之在写一个iOS应用之前必须做的7件事(附相关资源)
  9. 用Android Studio开发最常用到的快捷键
  10. IOS之Objective-C学习 工厂模式