Leetcode - 259. 较小的三数之和

代码未经过验证,但解题思路是正确的:
class Solution {

    /**
     * 已知条件:数组nums和目标值target
     * 题目要求:计算使得i < j < k && nums[i] + nums[j] + nums[k] < target的三元组(i, j, k)的个数
     * 举例说明:nums = [-2, 0, 1, 3], target = 2; ret = 2
     */
    
    //本题和第15题(https://leetcode-cn.com/problems/3sum/)类似,用双指针的方式来解决
    public int threeSumSmaller(int[] nums, int target) {
        
        //先进行排序
        Arrays.sort(nums);
        
        //用于统计有多少个满足条件的三元组
        int count = 0;
        
        //每次for循环都固定住一个i的值
        for(int i = 0; i <= nums.length - 3; i++){
            
            //而j和k则作为左右指针
            int j = i + 1, k = nums.length - 1;
            while(j < k){

                //如果三数之和过大,则k左移(这里还有另一层含义:此时j也是固定住的)
                if(nums[i] + nums[j] + nums[k] >= target){
                    k--;
                
                //如果三数之和小于target,此时就找到了(k - j)个满足要求的三元组,然后j右移以指向下一个数
                //比如此时i, j, k分别为1, 2, 5,那么显然[(1, 2, 3), (1, 2, 4), (1, 2, 5)]都是满足要求的三元组
                //因此count自增3;并且j自增1,这样下次while循环将会判断三元组(1, 3, 5)是否满足要求
                } else{
                    count += k - j;
                    j++;
                }
            }
        }
        return count;
    }
}
全部评论

相关推荐

03-26 12:00
已编辑
门头沟学院 Java
offer魅魔_oc...:100-200每天,你还要倒贴100
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务