动态规划-子数组按位或操作

package main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 我们有一个非负整数数组 A。
 *
 * 对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i <= j),我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | ... | A[j]。
 *
 * 返回可能结果的数量。 (多次出现的结果在最终答案中仅计算一次。)
 *
 *  
 *
 * 示例 1:
 *
 * 输入:[0]
 * 输出:1
 * 解释:
 * 只有一个可能的结果 0 。
 * 示例 2:
 *
 * 输入:[1,1,2]
 * 输出:3
 * 解释:
 * 可能的子数组为 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。
 * 产生的结果为 1,1,2,1,3,3 。
 * 有三个唯一值,所以答案是 3 。
 * 示例 3:
 *
 * 输入:[1,2,4]
 * 输出:6
 * 解释:
 * 可能的结果是 1,2,3,4,6,以及 7 。
 *  
 *
 * 提示:
 *
 * 1 <= A.length <= 50000
 * 0 <= A[i] <= 10^9
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class BitwiseOrsOfSubarrays {

  public static void main(String[] args) {
    int[] param = new int[]{1,2,3,4};
    System.out.println("可能的结果数为:"+subarrayBitwiseORs(param));
  }

/*
 *参考如下作者
 *作者:hundanLi
 *链接:https://leetcode-cn.com/problems/bitwise-ors-of-subarrays/solution/dong-tai-gui-hua-by-hundanli-4/
 *来源:力扣(LeetCode)
 *著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
  public static int subarrayBitwiseORs(int[] arr) {
    //重点在于如何将连续的组合或数据存储起来
    Set set = new HashSet<>();
    for (int i = 0; i < arr.length; i++) {
      set.add(arr[i]);
      for (int j = i - 1; j >= 0; j--) {
        if ((arr[i] | arr[j]) == arr[j]) {
          // arr[j]的置位位置包含了arr[i]的置位位置,
          // 那么已经无需考虑arr[i]的加入与否
          break;
        }
        // 求值的同时保留积累状态
        arr[j] |= arr[i];
        set.add(arr[j]);
      }
    }
    return set.size();
  }
}

你可能感兴趣的:(动态规划-子数组按位或操作)