Bitwise ORs of Subarrays

We have an array A of non-negative integers.

For every (contiguous) subarray B = [A[i], A[i+1], ..., A[j]] (with i <= j), we take the bitwise OR of all the elements in B, obtaining a result A[i] | A[i+1] | ... | A[j].

Return the number of possible results.  (Results that occur more than once are only counted once in the final answer.)

 

Example 1:

Input: [0]
Output: 1
Explanation: 
There is only one possible result: 0.

Example 2:

Input: [1,1,2]
Output: 3
Explanation: 
The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2].
These yield the results 1, 1, 2, 1, 3, 3.
There are 3 unique values, so the answer is 3.

Example 3:

Input: [1,2,4]
Output: 6
Explanation: 
The possible results are 1, 2, 3, 4, 6, and 7.

 

Note:

  1. 1 <= A.length <= 50000
  2. 0 <= A[i] <= 10^9

 

思路:1,最为简单两层for循环,一个set集合搞定。

           2,进阶,使用已有运算集合,减少运维,但是没有考虑到连续性。

           3,优化,考虑到连续性子数组。

 

class Solution {
public:
    int subarrayBitwiseORs(vector& A) {
        
        set ans;
        set cur;
        cur.insert(0);
        for(auto x : A)
        {
            set cur1;
            for(auto element : cur)
            {
                cur1.insert(element | x);
            }
            cur1.insert(x);
            cur = cur1;
            for(auto element : cur)
            {
                ans.insert(element);
            }
        }
        return ans.size();
    }
};

 

你可能感兴趣的:(LeetCode,位操作)