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
}
}

执行结果如下:


左神java代码复制版
左神java代码原版

2021-05-13:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,返回arr的最大子数组异或和。的更多相关文章

  1. 2357. 使数组中所有元素都等于零 (Easy)

    问题描述 2357. 使数组中所有元素都等于零 (Easy) 给你一个非负整数数组 nums .在一步操作中,你必须: 选出一个正整数 x , x 需要小于或等于 nums 中 最小 的 非零 元素. ...

  2. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  3. JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )

    题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...

  4. 让NSArray数组中每个对象都调用的方法

    1. [array valueForKey:@"title"]; //Returns an array containing the results of invoking val ...

  5. 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?

    这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...

  6. Excel表列名称(给定一个正整数,返回它在 Excel 表中相对应的列名称。)

    例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> AB ... 示例 1: 输入: 1 输出: "A ...

  7. 偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

    今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2 ...

  8. [Jobdu] 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

  9. 剑指Offer面试题:2.二维数组中的查找

    一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  10. 【面试题003】c数组做为参数退化的问题,二维数组中的查找

    [面试题003]c数组做为参数退化的问题,二维数组中的查找  一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...

随机推荐

  1. 错误:为仓库 'appstream' 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist

    sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* sudo sed -i -e &qu ...

  2. webpack之性能优化(webpack4)

    在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...

  3. gerrit部署使用

    前言 gerrit是基于git的工具,code review功能是开发中很方便,此外它可以配合Jenkins进行自动化的编译工作.今天给大家分享一下gerrit在ubuntu的安装使用 作者:良知犹存 ...

  4. Error:(x,x) java: 程序包com.xxx.xxx不存在

    [问题描述]:项目为SpringBoot 项目多个 module依赖,对子模块进行 compile/install 时出现了依赖的类(此类是自己写的类)不存在.

  5. Anconda、Pycharm下载、安装、配置教程(极其详细)

    Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大( ...

  6. 机器学习基础07DAY

    分类算法之决策树 决策树是一种基本的分类方法,当然也可以用于回归.我们一般只讨论用于分类的决策树.决策树模型呈树形结构.在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的 ...

  7. 借AI之势,打破创意与想象的边界

    不要做这个时代的最后一只恐龙. IMMENSE.36氪|作者 1811年11月,英国,诺丁汉市西北一处小镇里,一群愤怒的纺织工人挥舞着锤头与斧子,一窝蜂地冲进车间里,将几台机器砸得粉碎. 后来,这场运 ...

  8. 念一句咒语 AI 就帮我写一个应用,我人麻了...

    原文链接:https://forum.laf.run/d/232 作为人类,我们时常会有自己独特的想法和脑洞大开的创意.然而,这些想法往往因为成本过高而无法实现,毕竟每个人的能力和精力都是有限的,尤其 ...

  9. kubectl管理多个集群配置

    需求描述:在一台机器上通过kubectl管理多个Kubernetes集群. 操作过程:将各集群的kubectl config文件中的证书内容转换,通过命令创建config文件:通过上下文切换使用不同集 ...

  10. Atcoder Regular Contest 093 C - Bichrome Spanning Tree

    给定一张图,对图上边黑白染色,使得同时选择了两种颜色边的最小生成树边权和为X,求染色方案数. 先求出图的\(mst\)大小,然后分三类讨论: 1.\(X<mst\) 无解 2.\(X==mst\ ...