【发布时间】: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