​LeetCode刷题实战259:较小的三数之和

程序IT圈

共 3656字,需浏览 8分钟

 ·

2021-05-10 14:31

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 较小的三数之和,我们先来看题面:
https://leetcode-cn.com/problems/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.

给定一个长度为 n 的整数数组和一个目标值 target,寻找能够使条件 nums[i] + nums[j] + nums[k] < target 成立的三元组 i, j, k 个数(0 <= i < j < k < n)。

示例


示例:
输入: nums = [-2,0,1,3], target = 2
输出: 2 
解释: 因为一共有两个三元组满足累加和小于 2:
     [-2,0,1]
     [-2,0,3]
进阶:是否能在 O(n2) 的时间复杂度内解决?


解题

https://segmentfault.com/a/1190000003794736

先对整个数组排序,然后一个外层循环确定第一个数,然后里面使用头尾指针left和right进行夹逼,得到三个数的和。如果这个和大于或者等于目标数,说明我们选的三个数有点大了,就把尾指针right向前一位(因为是排序的数组,所以向前肯定会变小)。如果这个和小于目标数,那就有right - left个有效的结果。为什么呢?因为假设我们此时固定好外层的那个数,还有头指针left指向的数不变,那把尾指针向左移0位一直到左移到left之前一位,这些组合都是小于目标数的。

public class Solution {
    public int threeSumSmaller(int[] nums, int target) {
        // 先将数组排序
        Arrays.sort(nums);
        int cnt = 0;
        for(int i = 0; i < nums.length - 2; i++){
            int left = i + 1, right = nums.length - 1;
            while(left < right){
                int sum = nums[i] + nums[left] + nums[right];
                // 如果三个数的和大于等于目标数,那将尾指针向左移
                if(sum >= target){
                    right--;
                // 如果三个数的和小于目标数,那将头指针向右移
                } else {
                    // right - left个组合都是小于目标数的
                    cnt += right - left;
                    left++;
                }
            }
        }
        return cnt;
    }
}


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:
LeetCode1-240题汇总,希望对你有点帮助!
LeetCode刷题实战241:为运算表达式设计优先级
LeetCode刷题实战242:有效的字母异位词
LeetCode刷题实战243:最短单词距离
LeetCode刷题实战244:最短单词距离 II
LeetCode刷题实战245:最短单词距离 III
LeetCode刷题实战246:中心对称数
LeetCode刷题实战247:中心对称数II
LeetCode刷题实战248:中心对称数III
LeetCode刷题实战249:移位字符串分组
LeetCode刷题实战250:统计同值子树
LeetCode刷题实战251:展开二维向量
LeetCode刷题实战252:会议室
LeetCode刷题实战253:会议室II
LeetCode刷题实战254:因子的组合
LeetCode刷题实战255:验证前序遍历序列二叉搜索树
LeetCode刷题实战256:粉刷房子
LeetCode刷题实战257:二叉树的所有路径

LeetCode刷题实战258:各位相加


浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报