1. 程式人生 > >子序列的按位或 Bitwise ORs of Subarrays

子序列的按位或 Bitwise ORs of Subarrays

覆蓋 暴力求解 alt return hset div size bubuko csharp

2018-09-23 19:05:20

問題描述:

技術分享圖片

技術分享圖片

問題求解:

顯然的是暴力的遍歷所有的區間是不可取的,因為這樣的時間復雜度為n^2級別的,對於規模在50000左右的輸入會TLE。

然而,最後的解答也可以看作是一個暴力求解,也就是用Set來保存以當前數為結尾的左右可能解,在下一輪中遍歷上一輪的所有解並進行或操作。

這裏有個難以一下想到的地方就是,乍一看,這個時間復雜度依然是平方級別的,但是實際上,這裏的時間復雜度是n級別的,因為Set中後一個數中的1完全覆蓋前一個數,因此,最多只有不超過30個數在Set中,因此整個時間復雜度依然是線性的時間復雜度。

技術分享圖片

    public int subarrayBitwiseORs(int[] A) {
        Set<Integer> res = new HashSet<>();
        Set<Integer> cur = new HashSet<>();
        for (int i : A) {
            Set<Integer> tmp = new HashSet<>();
            tmp.add(i);
            for (Integer j : cur) tmp.add(i | j);
            res.addAll(tmp);
            cur = tmp;
        }
        return res.size();
    }

子序列的按位或 Bitwise ORs of Subarrays