首页 > 其他 > 详细

[Locked] 3Sum Smaller

时间:2016-02-23 13:08:26      阅读:100      评论:0      收藏:0      [点我收藏+]

3Sum Smaller

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(n^2) runtime?

分析:

  1、暴力做法O(n^3)

  2、如果题目是等于target,那么一种很直观的想法,对于nums中每个数,用target去减,然后问题就转换成了O(n)复杂度解决两数之和为target。

  3、这题是小于target,用hash的方法复杂度为O(n^2*logn),若先排序,然后用夹逼的方法做复杂度可为O(n^2);

代码:

 

int tripletsNumber(vector<int> &nums, int target) {
    int count = 0;
    sort(nums.begin(), nums.end());
    for(int i = 0; i < nums.size(); i++) {
        //从后面两个数的取值界限定为i,这样保证triplets不重复
        int j = i + 1, k = int(nums.size()) - 1, newt = target - nums[i];
        while(j < k) {
            if(nums[j] + nums[k] < newt) {
                count += k - j;
                j++;
            }
            else
                k--;
        }
    }
    return count;
}

 

[Locked] 3Sum Smaller

原文:http://www.cnblogs.com/littletail/p/5208056.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!