2021-05-13:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,返回arr的最大子数组异或和。
2021-05-13:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,返回arr的最大子数组异或和。
前缀树。一个数,用二进制表示,0走左边分支,1走右边分支。
时间复杂度:O(N)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
)
func main() {
arr := []int{-1, 2}
ret := maxXorSubarray2(arr)
fmt.Println(ret)
}
// 前缀树的Node结构
// nexts[0] -> 0方向的路
// nexts[1] -> 1方向的路
// nexts[0] == null 0方向上没路!
// nexts[0] != null 0方向有路,可以跳下一个节点
// nexts[1] == null 1方向上没路!
// nexts[1] != null 1方向有路,可以跳下一个节点
type Node struct {
nexts []*Node
}
func twoSelectOne(condition bool, a int, b int) int {
if condition {
return a
} else {
return b
}
}
func NewNode() *Node {
ret := &Node{}
ret.nexts = make([]*Node, 2)
return ret
}
// 基于本题,定制前缀树的实现
type NumTrie struct {
// 头节点
head *Node
}
func NewNumTrie() *NumTrie {
ret := &NumTrie{}
ret.head = NewNode()
return ret
}
func (this *NumTrie) add(newNum int) {
cur := this.head
for move := 63; move >= 0; move-- {
path := (newNum >> move) & 1
if cur.nexts[path] == nil {
cur.nexts[path] = NewNode()
}
cur = cur.nexts[path]
}
}
// 该结构之前收集了一票数字,并且建好了前缀树
// num和 谁 ^ 最大的结果(把结果返回)
func (this *NumTrie) maxXor(num int) int {
cur := this.head
ans := 0
for move := 63; move >= 0; move-- {
// 取出num中第move位的状态,path只有两种值0就1,整数
path := (num >> move) & 1
// 期待遇到的东西
best := twoSelectOne(move == 63, path, path ^ 1)
// 实际遇到的东西
best = twoSelectOne(cur.nexts[best] != nil, best, best ^ 1)
// (path ^ best) 当前位位异或完的结果
ans |= (path ^ best) << move
cur = cur.nexts[best]
}
return ans
}
// O(N)
func maxXorSubarray2(arr []int) int {
if len(arr) == 0 {
return 0
}
max := math.MinInt64
// 0~i整体异或和
xor := 0
numTrie := NewNumTrie()
numTrie.add(0)
for i := 0; i < len(arr); i++ {
xor ^= arr[i] // 0 ~ i
max = getMax(max, numTrie.maxXor(xor))
numTrie.add(xor)
}
return max
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2021-05-13:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,返回arr的最大子数组异或和。的更多相关文章
- 2357. 使数组中所有元素都等于零 (Easy)
问题描述 2357. 使数组中所有元素都等于零 (Easy) 给你一个非负整数数组 nums .在一步操作中,你必须: 选出一个正整数 x , x 需要小于或等于 nums 中 最小 的 非零 元素. ...
- 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。
[题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...
- JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )
题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...
- 让NSArray数组中每个对象都调用的方法
1. [array valueForKey:@"title"]; //Returns an array containing the results of invoking val ...
- 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?
这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...
- Excel表列名称(给定一个正整数,返回它在 Excel 表中相对应的列名称。)
例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ... 示例 1: 输入: 1 输出: "A ...
- 偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2 ...
- [Jobdu] 题目1527:首尾相连数组的最大子数组和
题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...
- 剑指Offer面试题:2.二维数组中的查找
一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 【面试题003】c数组做为参数退化的问题,二维数组中的查找
[面试题003]c数组做为参数退化的问题,二维数组中的查找 一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...
随机推荐
- eclipse console 控制台输出乱码解决办法
一.console输出日志显示乱码 二.在类编辑处点击右键 Run As --> Run Configurations 三.在Common中设置字符集 gbk 四.restart 搜索 复制
- Hyperf安装
转载网址: https://www.cnblogs.com/lyc94620/p/12821723.html
- Web For Pentester - SQL injections/Directory traversal
SQL injections Example 1 典型的SQL注入 name=root' or 1=1 %23 直接执行就可以导出所有用户 查看后端的源码 观察到,我们传入入的name中,传入就成为了 ...
- SpringBoot笔记--自动配置(高级内容)(下集)
案例需求 实现步骤: 具体的实现 1.引入Jedis依赖 2.提供Jedis的Bean 找到SpringBoot的执行文件,按住Ctrl键,进入SpringBootApplication注解,再进入E ...
- Python学习笔记--判断语句的延续
if else语句 示例: 需要注意的是,if后面必须有条件,而else后面可以不需要判断条件 案例: 实现: if elif else 语句 多条件判断,if 和 elif 后面必须有条件,else ...
- InstructPix2Pix: 动动嘴皮子,超越PS
摘要:InstructPix2Pix提出了一种使用文本编辑图像的方法:给定输入图像和编辑指令,告诉模型要做什么,模型将遵循这些指令来编辑图像. 本文分享自华为云社区<InstructPix2Pi ...
- Typora怎么插入行内公式?内联公式设置
文件 偏好设置 把内联公式那个勾上就可以了.然后就能写latex了,像这样,$\alpha\$ \(\alpha\) 输入一个\$后再按esc,会自动补全为$$
- SQL server分页的三种方法
一.Entity Framework的Linq语句的分页写法: var datacount = test.OrderBy(t => t.testID) .Skip(pageSize * (pag ...
- Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内
Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内 语法 element.scrollIntoView(); // 等同于element.scrollInt ...
- 迁移学习(DCCL)《Domain Confused Contrastive Learning for Unsupervised Domain Adaptation》
论文信息 论文标题:Domain Confused Contrastive Learning for Unsupervised Domain Adaptation论文作者:Quanyu Long, T ...