[Locked] 3Sum Smaller

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;
}

 

posted @ 2016-02-23 11:10  CarlGoodman  阅读(128)  评论(0编辑  收藏  举报