【问题标题】:Determine the subarray for which the logical AND of the first two elements is maximal确定前两个元素的逻辑与最大的子数组
【发布时间】:2021-09-01 04:23:52
【问题描述】:

我们有一个包含 n 个整数的数组,我们需要确定前两个元素的逻辑与最大的子数组。我们需要返回左右索引。

样本输入:3 3 5

输出:0 1

我尝试了以下解决方案:

List<Integer> list = new LinkedList<>();
List<Integer> llist = new LinkedList<>();
    int max = Integer.MIN_VALUE;
    
    for(int i =0; i < arr.size(); i ++){
        for(int j=i+1; j < arr.size(); j++ ){
            int a = arr.get(i);
            int b = arr.get(j);
            
            if((a & b) > max){
                max = (a & b);
                list.clear();
                list.add(i);
                list.add(j);
            }
            else if((a & b) == max){
                list.add(i);
                list.add(j);
            }
        }
    }
    
    if (list.size() > 2) {
       llist.add(list.get(0));
       llist.add(list.get(1));
       return llist;
    }

    return list;
}

复杂度是 n 平方的阶。我们可以优化这个吗? 有没有更好的方法来解决这个问题?有人可以指导我吗?

【问题讨论】:

  • 也许您可以利用AND 永远无法设置参与运算符中不存在的位的事实,因此如果您将当前最大值设置为a[i] AND a[i+n] 并且(a[i] AND a[i+n]) == a[i] 则没有n 的更高值将能够进一步最大化 a[i]
  • 抱歉,我没有完全理解你的意思。你能用一个例子解释一下吗@500-InternalServerError
  • 好吧,我猜这确实有点不透明。 --- 示例:假设第一个值 a[i] 是 3 - 3 显然设置了位 0 和 1。没有任何值可以与 3 相乘以在结果中设置更多位,即产生大于 3 的最大值。因此,一旦我们看到一个值,当与 3 与 3 相加时,我们知道我们有一个此起始值的最大值,无需进一步查看。
  • 这样更有意义吗?
  • 我确实让你指出,既然 3 的二进制注释是 011,那么如果它与任何其他数字进行“与”运算,答案将是 3。但是我们如何找到这个数字呢?

标签: algorithm sorting data-structures logical-operators logical-and


【解决方案1】:

根据您的代码,如果您只需要一个结果(第一个最好的)并假设二进制补码整数格式,您可以这样做:

   List<Integer> list = new LinkedList<>();
  int max = arr.get(0) & arr.get(1);
  int bestAind=0; bestBind=0;
  int OnesMask = Integer.MAX_VALUE; //Needed when using negative values

    for(int i =0; i < arr.size(); i ++)
    {
        int a = arr.get(i);

        if(a & OnesMask <max)
           continue;

        for(int j=i+1; j < arr.size(); j++ )
        {           
            int b = arr.get(j);
            
            if((a & b) > max){
                max = (a & b);
                bestAind = i;
                bestBind = j;
            }            
        }
    }
    
    if (bestAind != bestBind ) {
       list.add(bestAind );
       list.add(bestBind );
    }

    return list;
}

这可能会减少一点处理时间,但这取决于数组的初始排序。最好情况O(n),最坏情况O(n^2)

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2017-04-19
    • 1970-01-01
    • 2023-04-05
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2014-10-21
    相关资源
    最近更新 更多