首先朴素的解法是双层循环从前往后进行or运算。但是我们不难想到可以优化已经or过的值
假设curr = arr[i]; for j in range(i-1,-1,-1)我们可以通过更新curr = curr | arr[j] 并 判断curr | arr[j] = curr决定是否继续
逻辑漏洞1:
j前面的值怎么办?因为arr没有单调性,我们如何知道j前面的值是否可用呢- 例如
1,2,6,6|2 = 6, 但6|1 = 7
所以并非根据当前值来判断而是要根据前面值来判断当前值是否有必要添加进入,即判断curr|arr[j] = arr[j]。
这样一来就可以回答前面的漏洞
- 因为
curr | arr[j] = arr[j], 那么j之前的数,在curr = arr[j]时,就已被判断过。无需继续操心
此时我们有两种可以更新的方式curr = curr | arr[j]或者arr[j] = curr | arr[j]。前面一种是局部更新,这也意味着,我们对整体没有太大的优化,最多只会减少几次循环。而后面一种我们更新了原来的值,通过范围可知最多会被更新30次,这也意味着对于curr来说最多遍历前面29组相同的数