leetcode 15.三数之和

目前只想到一种解法,即利用指针思想外加循环实现

时间复杂度O(N^2) 

解法一

JAVA描述: 

public List<List<Integer>> threeSum(int[] nums) {

        List<List<Integer>> result = new ArrayList<List<Integer>>();

        int len = nums.length;

        if (len < 3) return result;

        Arrays.sort(nums);

        for (int i = 0; i < len; ++i) {

            if(nums[i] > 0) break; //总和肯定大于0

            if(i > 0 && nums[i] == nums[i - 1]) continue; //去指针i重复

            int L = i + 1; //指针L

            int R = len - 1; //指针R

            while (L < R) {

                int sum = nums[i] + nums[L] + nums[R];

                // 自顶向下写法

                if (sum == 0) {

                    result.add(Arrays.asList(nums[i], nums[L], nums[R]));

                    //遇到重复的指针多跳一个单位

                    while (L < R && nums[L] == nums[L + 1]) {

                        L++;

                    }

                    while (L < R && nums[R] == nums[R - 1]) {

                        R--;

                    }

                    L++;

                    R--;

                }else if (sum < 0) {

                    L++;

                }else if (sum > 0) {

                    R--;

                }

            }

        }

        return result;

    }

javaScript描述:

var threeSum = function(nums) {

    const results = [];

    if(nums.length < 3) return results;

    nums = nums.sort((a, b) => a - b)

    let target = 0;

    for(let i = 0; i < nums.length - 2; i++) {

        if(nums[i] > target) break;

        if(i > 0 && nums[i] === nums[i - 1]) continue;

        let j = i + 1;

        let k = nums.length - 1;

        while(j < k) {

            let sum = nums[i] + nums[j] + nums[k];

            if(sum === target) {

                results.push([nums[i], nums[j], nums[k]]);

                while(nums[j] === nums[j + 1]) j++;

                while(nums[k] === nums[k - 1]) k--;

                j++;

                k--;

            }else if(sum < target) {

                j++;

            }else {

                k--;

            }

        }

    }

    return results;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值