美文网首页
259. 3Sum Smaller 三数之和较小值

259. 3Sum Smaller 三数之和较小值

作者: xingzai | 来源:发表于2021-09-03 00:48 被阅读0次

    题目链接
    tag:

    • Medium
    • Two Pointers

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

    // O(n^2)
    class Solution {
    public:
        int threeSumSmaller(vector<int>& 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://www.cnblogs.com/grandyang/p/4481576.html

    相关文章

      网友评论

          本文标题:259. 3Sum Smaller 三数之和较小值

          本文链接:https://www.haomeiwen.com/subject/eeehwltx.html