`

Leetcode - 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(n2) runtime?

[分析]
延续3Sum & 3Sum Closest的基本套路,先排序输入数组,固定第一个数后在剩余数组区间中寻找所有满足条件的另外两个数,使用two pointers技巧进行寻找。
关键点是一旦找到 i, j 满足nums[i] + nums[j] + nums[k] < target, 因为数组已排序,则(i, j-1, k),(i, j - 2, k)...(i, i+1, k)均是满足条件的解,这些解总共是 j - i个,而无需一个一个check它们。
此外需注意此题不需要去重处理,一开始画蛇添足进行了去重处理……
很开心思路和leetcode讨论版的最佳思路一致~

public class Solution {
    public int threeSumSmaller(int[] nums, int target) {
        if (nums == null || nums.length < 3)
            return 0;
        Arrays.sort(nums);
        int counter = 0;
        int end = nums.length - 3;
        for (int k = 0; k <= end; k++) {
            int i = k + 1, j = nums.length - 1;
            while (i < j) {
                int sum3 = nums[i] + nums[j] + nums[k];
                if (sum3 < target) {
                    counter += j - i;
                    i++;
                } else {
                    while (i < --j && nums[j] == nums[j + 1]);
                }
            }
        }
        return counter;
    }
}
分享到:
评论

相关推荐

    2sumleetcode-leetcode:leetcode

    2Sum-&gt;3Sum(hash) 2Sum Less Than K-&gt;3Sum Closet-&gt;3Sum Smaller(两个指针接近) 找到重复的号码 两个指针: 链表循环 BF: DP: 数学: i^0=i;i^i=0 单号-&gt;单号2-&gt;单号3 n&n-1 例 12。 1 位数 13. 汉明距离 二...

    leetcode-LeetCode:力码

    [3Sum Smaller.java]( Smaller.java) Java 1 Java 2 [外星词典.java](Dictionary.java) Java 3 [二叉搜索树Iterator.java](搜索树Iterator.java) Java 4 [二叉树中序遍历.java]( 树中序遍历.java) Java 5 [二叉树级...

    LeetCode最全代码

    16 | [3 Sum Closest](https://leetcode.com/problems/3sum-closest/) | [C++](./C++/3sum-closest.cpp) [Python](./Python/3sum-closest.py) | _O(n^2)_ | _O(1)_ | Medium || Two Pointers 18| [4 Sum]...

    股票买卖最佳时机leetcode-Dsa_Interview_Preparation:数据结构和算法面试准备

    股票买卖最佳时机leetcode 结帐解决方案分支解决方案。 话题 问题 地位 数组 1: Add_one_to_number C++ :check_mark_button: Java Python 解释。 2: Beggars_outside_temple C++ Java Python 解释。 3: Bob_and_...

    leetcode答案-other-LeetCode:其他-LeetCode

    leetcode 答案力码 参考文献 问题:容易 问题·选ぶにあたり、参考になりそうなサイト 蟒の文法解说 问题 src/answer/two_sum.py src/answer/two_sum_2.py src/answer/two_sum_4.py src/answer/running_sum_of_1d_...

    Python_leetcode.zip

    首先,我们来看"count-of-smaller-numbers-after-self.py"。这个文件中的问题涉及到排序和二分查找技术,要求在保持数组原顺序不变的情况下,计算每个元素后面有多少个比它小的元素。解决这个问题的关键在于巧妙地...

    leetcode答案-Algorithm:算法

    leetcode 答案力码 每周回顾: 1.快速排序/合并排序 912 - 2. 总和为 K 的子数组的数量 560 - 3. LIS 300 - 4. Kadane 53 - 5. 子数组最大和不大于k sorted_presum = [ 0 ] # add 0 to handle empty list case ans =...

    javalruleetcode-LintCode20160430:LintCode20160430

    [3Sum Smaller.java]( Smaller.java) Java 6 [4 Sum.java]( Sum.java) Java 7 Java 8 [添加和搜索 Word.java](和搜索 Word.java) Java 9 [添加Binary.java](Binary.java) Java 10 [加两个数II.java]( 两个数II....

    javalruleetcode-LintCode20170127:LintCode20170127

    java lru leetcode Java算法问题 托管来自 LintCode、LeetCode 等算法问题的 Java 解决方案。 一旦出现新问题或新测试用例,我将尝试...[3Sum Smaller.java]( Smaller.java) Java 6 [4 Sum.java]( Sum.java) 中等的 J

    javalruleetcode-LeetFlag:利特标志

    Sum when it comes 2 range: query range & root range, 搞清楚什么变,什么不变,compare的哪个range的mid. Access modifier & inner class: 对于modify不要忘了recursion 的 edge case要return。 248 Count of ...

Global site tag (gtag.js) - Google Analytics