算法练习(68): 快速 3-sum(1.4.15)

本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本人新建了一个微信群(算法交流),想要加入的,请添加我的微信号:zhujinhui207407 谢谢。另外,本人的个人博客 http://www.kyson.cn 也在不停的更新中,欢迎一起讨论

算法(第4版)

知识点

  • 快速 3-sum

题目

1.4.15 快速 3-sum。作为热身,使用一个线性级别的算法(而非基于二分查找的线性对数级别的算法)实现 TwoSumFaster 来计算已排序的数组中和为 0 的整数对的数量。用相同的思想为 3-sum 问题给出一个平方级别的算法。


1.4.15 Faster 3-sum. As a warmup, develop an implementation TwoSumFaster that uses a linear algorithm to count the pairs that sum to zero after the array is sorted (in- stead of the binary-search-based linearithmic algorithm). Then apply a similar idea to develop a quadratic algorithm for the 3-sum problem.

分析

基于上一题的答案,我们不难得出这道题的答案

答案

public class TwoSumFaster {
    public int twoSumFaster(int[] a) {
        int cnt = 0;
        int len = a.length;
        for (int j = 0, k = len - 1; j < k;) {
            if (a[j] + a[k] < 0) {
                j++;
            } else if (a[j] + a[k] > 0) {
                k--;
            } else {
                j++;
                k--;
                ++cnt;
            }
        }
        return cnt;
    }
}
public class ThreeSumFaster {   
    public int threeSumFaster(long[] a) {
        int cnt = 0;
        int len = a.length;
        for (int j = 0; j < len - 2 ; j ++) {
            for(int k = j + 1,h = len -1;k < h;){
                if (a[j] + a[k] + a[h] < 0) {
                    k++;
                } else if (a[j] + a[k] + a[h] > 0) {
                    h--;
                } else {
                    k++;
                    h--;
                    ++cnt;
                }
            }
        }
        return cnt;
    }
}

代码索引

TwoSumFaster.java

ThreeSumFaster.java

广告

我的首款个人开发的APP壁纸宝贝上线了,欢迎大家下载。

你可能感兴趣的:(算法练习(68): 快速 3-sum(1.4.15))