关于周赛1498题的疑惑

来源:3-1 从二分查找法看如何写出正确的程序

v不离不弃v

2020-07-01

波波老师,周赛1498题我是利用排序+双指针,可是我总是在数组在32以下的都可以AC,但是数据量超过32就不行,我加了快速幂,但是还是不行,现在不知道怎么办了,波波老师,您可以帮我看看我的逻辑有错嘛,我已经困扰这个问题好几天了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

class Solution {
    public int numSubseq(int[] nums, int target) {
        Arrays.sort(nums);
        int res = 0;
        int l = 0, r = nums.length - 1;
        //双指针,始终保持左边的数有效
        while (l <= r) {
            if (nums[l] + nums[r] > target) 
                r--;
            else {
                res = (int)((res + myPow(2, r - l)) % (1000000000 + 7));
                l++;
            }
        }
        return res;
    }
    //快速幂
    private long myPow(int x, int n){
        if(n == 0) return 1;
        long t = x;
        long res = 1;
        while(n > 0){
            if((n & 1) == 1)
                res *= t;
            t *= t;
            n >>= 1;
        }
        return res;
    }
}
写回答

1回答

liuyubobobo

2020-07-01

myPow 中的 res 和 t 是可能溢出的。 


改成下面的方式就 ok 了:


private long myPow(int x, int n){

    if(n == 0) return 1;
    long t = x;
    long res = 1;
    while(n > 0){
        if((n & 1) == 1)
            res = (res * t) % (1000000000 + 7);
        t = (t * t) % (1000000000 + 7);
        n >>= 1;
    }
    return res % (1000000000 + 7);
}


继续加油!:)

0
2
liuyubobobo
回复
v不离不弃v
double 没有溢出的概念,只有精度不准确。但是 long 有。long 意味着 2^63 就溢出了。这个问题的 n 达到了 10^5。
2020-07-01
共2条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程