Two Sum问题

经典的two/three sum算法

哈希法

请输入代码

two pointers方法

请输入代码

two/three sum的变形问题

关于three sum问题要做的和不要做的

应该做的

  • 第一个应该想到的方法是暴力解法,N integer就是N重循环,这是unacceptable solution,但是it's natural

  • 如果想使用two pointers而不是哈希的方法,那么一定要先sort array

  • 如果题目要求返回value不重复的pair/triple,那么一定要用HashSet 去重

  • 在while loop的condition判定中,无论哪种condition,一定都要更新pointer,否则会陷入死循环

不应该做的

  • 如果是返回结果和index有关或者题目本身条件判定和index有关,那么不建议使用two pointers方法,因为在sort array的时候original index信息会丢失(尽管我们可以用wrapper class把original index信息放进去,但是那样代码会复杂一些),这时哈希方法可能会更好

  • 如果while loop里头的condition判定条件可以i++或者j--(或者说 i++ 和j--都必须尝试),那么这种方法不建议使用,因为无法判断下一步的操作。这时候可以尝试anchor不一样的index,如果现在是把第一个index anchor住,那么可以考虑把最后一个anchor,使得最后没有任何的“歧义”。

Triangle Count :Given an array of integers, how many three numbers can be found in the array, so that we can build an triangle whose three edges length is the three numbers that we find?

Given array S = [3,4,6,7], return 3. They are:

[3,4,6]
[3,6,7]
[4,6,7]

Given array S = [4,4,4,4], return 4. They are:

[4(1),4(2),4(3)]
[4(1),4(2),4(4)]
[4(1),4(3),4(4)]
[4(2),4(3),4(4)]

public int triangleCount(int S[]) {
        // write your code here
        int res = 0;
        if(S.length == 0 || S == null)
            return res;
        Arrays.sort(S);
        for(int i = S.length - 1; i > 0; i--) {
            int l = 0;
            int r = i - 1;
            while(l < r) {
                if(S[l] + S[r] > S[i]){
                    res += (r-l);
                    r--;
                }
                else
                    l++;
            }
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值