Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-04-04:给定一个非负数组arr,和一个正数m的最大值。

2021-04-04:给定一个非负数组arr,和一个正数m的最大值。

原创
作者头像
福大大架构师每日一题
修改于 2021-04-06 03:26:02
修改于 2021-04-06 03:26:02
8730
举报

2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。

福大大 答案2021-04-04:

自然智慧即可。

1.递归,累加和。

2.动态规划,累加和。

3.动态规划,累加和%m。

4.双向动态规划,累加和%m。

代码用golang编写。代码如下:

代码语言:txt
AI代码解释
复制
package main

import (
    "fmt"
    "math/rand"
    "sort"
    "time"
)

func main() {
    rand.Seed(time.Now().Unix())
    const TOTAL = 500
    RightCount := 0
    for i := 0; i < TOTAL; i++ {
        arr := NewRandArr()
        m := rand.Intn(200) + 1
        fmt.Println(arr, m)
        ret1 := max1(arr, m)
        fmt.Println("1.递归,累加和:", ret1)
        ret2 := max2(arr, m)
        fmt.Println("2.动态规划,累加和:", ret2)
        ret3 := max3(arr, m)
        fmt.Println("3.动态规划,累加和%m:", ret3)
        ret4 := max4(arr, m)
        fmt.Println("4.双向动态规划,累加和%m:", ret4)
        fmt.Println("---------------------")
        if ret1 == ret2 && ret1 == ret3 && ret1 == ret4 {
            RightCount++
        }
    }
    fmt.Println("总数:", TOTAL)
    fmt.Println("正确:", RightCount)
}

//递归,算出所有子序列的累加和
func max1(arr []int, m int) int {
    set := make(map[int]struct{})
    process(arr, 0, 0, set)
    max := 0
    for sum, _ := range set {
        max = getMax(max, sum%m)
    }
    return max
}

func process(arr []int, index int, sum int, set map[int]struct{}) {
    if index == len(arr) {
        set[sum] = struct{}{}
    } else {
        process(arr, index+1, sum, set)
        process(arr, index+1, sum+arr[index], set)
    }
}
func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

//2.动态规划,算出所有的累加和
func max2(arr []int, m int) int {
    sum := 0
    N := len(arr)
    for i := 0; i < N; i++ {
        sum += arr[i]
    }
    dp := make([][]bool, N)
    for i := 0; i < N; i++ {
        dp[i] = make([]bool, sum+1)
    }
    for i := 0; i < N; i++ {
        dp[i][0] = true
    }
    dp[0][arr[0]] = true
    for i := 1; i < N; i++ {
        for j := 1; j <= sum; j++ {
            dp[i][j] = dp[i-1][j]
            if j-arr[i] >= 0 {
                dp[i][j] = dp[i][j] || dp[i-1][j-arr[i]]
            }
        }
    }
    ans := 0
    for j := 0; j <= sum; j++ {
        if dp[N-1][j] {
            ans = getMax(ans, j%m)
        }
    }
    return ans
}

//3.动态规划,算出所有的模m的累加和。数组长度巨大,m不大。
func max3(arr []int, m int) int {
    N := len(arr)
    // 0...m-1
    dp := make([][]bool, N)
    for i := 0; i < N; i++ {
        dp[i] = make([]bool, m)
    }
    for i := 0; i < N; i++ {
        dp[i][0] = true
    }
    dp[0][arr[0]%m] = true
    for i := 1; i < N; i++ {
        for j := 1; j < m; j++ {
            // dp[i][j] T or F
            dp[i][j] = dp[i-1][j]
            cur := arr[i] % m
            if cur <= j {
                dp[i][j] = dp[i][j] || dp[i-1][j-cur]
            } else {
                dp[i][j] = dp[i][j] || dp[i-1][m+j-cur]
            }
        }
    }
    ans := 0
    for i := 0; i < m; i++ {
        if dp[N-1][i] {
            ans = i
        }
    }
    return ans
}

// 如果arr的累加和很大,m也很大
// 但是arr的长度相对不大
func max4(arr []int, m int) int {
    if len(arr) == 1 {
        return arr[0] % m
    }
    mid := (len(arr) - 1) / 2

    sortSet1 := make(map[int]struct{})
    process4(arr, 0, 0, mid, m, sortSet1)
    sortSet2 := make(map[int]struct{})
    process4(arr, mid+1, 0, len(arr)-1, m, sortSet2)
    ans := 0

    s1 := make([]int, 0)
    for key, _ := range sortSet1 {
        s1 = append(s1, key)
    }
    sort.Ints(s1)
    //fmt.Println("s1:", s1)

    s2 := make([]int, 0)
    for key, _ := range sortSet2 {
        s2 = append(s2, key)
    }
    sort.Ints(s2)
    //fmt.Println("s2:", s2)

    for _, leftMod := range s1 {
        //ans = getMax(ans, leftMod + sortSet2.floor(m - 1 - leftMod));
        index := NearestIndex2(s2, m-1-leftMod)
        if index >= 0 {
            ans = getMax(ans, leftMod+s2[index])
        } else {
            ans = getMax(ans, leftMod)
        }
    }
    return ans
}

// 在arr上,找满足<=value的最右位置
func NearestIndex2(arr []int, v int) int {
    L := 0
    R := len(arr) - 1
    index := -1 // 记录最右的对号
    for L <= R {
        mid := L + (R-L)>>1
        if arr[mid] <= v {
            index = mid
            L = mid + 1
        } else {
            R = mid - 1
        }
    }
    return index
}

// 从index出发,最后有边界是end+1,arr[index...end]
func process4(arr []int, index int, sum int, end int, m int, sortSet map[int]struct{}) {
    if index == end+1 {
        sortSet[sum%m] = struct {
        }{}
    } else {
        process4(arr, index+1, sum, end, m, sortSet)
        process4(arr, index+1, sum+arr[index], end, m, sortSet)
    }
}

func NewRandArr() []int {
    arrLen := rand.Intn(10) + 5
    arr := make([]int, arrLen)
    for i := 0; i < arrLen; i++ {
        arr[i] = rand.Intn(50)
    }
    return arr
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
Author: xidianwangtao@gmail.com 工作机制 cluster-proportional-autoscaler是kubernetes的孵化项目之一,用来根据集群规模动态的扩缩容指定的namespace下的target(只支持RC, RS, Deployment),还不支持对StatefulSet。目前只提供两种autoscale模式,一种是linear,另一种是ladder,你能很容易的定制开发新的模式,代码接口非常清晰。 cluster-proportional-autoscal
Walton
2018/04/16
1.6K0
「走进k8s」Kubernetes1.15.1的持久化存储StorageClass(32)
1.自动创建的 PV 以${namespace}-${pvcName}-${pvName}这样的命名格式创建在 NFS 服务器上的共享数据目录中。2.而当这个 PV 被回收后会以archieved-${namespace}-${pvcName}-${pvName}这样的命名格式存在 NFS 服务器上。3.下面的yaml涉及到3个yaml文件,都是参考github里面配置来的
IT架构圈
2019/09/08
8620
【云原生 | Kubernetes篇】深入了解Deployment(八)
Deployment控制RS,RS控制Pod的副本数 ReplicaSet: 只提供了副本数量的控制功能 Deployment: 每部署一个新版本就会创建一个新的副本集,利用他记录状态,回滚也是直接让指定的rs生效
Lansonli
2022/06/11
4410
【云原生 | Kubernetes篇】深入了解Deployment(八)
Prometheus监控神器-Kubernetes篇(一)
本篇使用StorageClass来持久化数据,搭建Statefulset的Prometheus联邦集群,对于数据持久化,方案众多,如Thanos、M3DB、InfluxDB、VictorMetric等,根据自己的需求进行选择,后面会详细讲解针对数据持久化的具体细节。
Kubernetes技术栈
2020/09/09
2K0
k8s之RBAC授权模式
基于角色的访问控制,启用此模式,需要在API Server的启动参数上添加如下配置,(k8s默然采用此授权模式)。
Liusy
2020/11/19
1.4K0
k8s之RBAC授权模式
K8s 安装
如果你的节点上面有科学上网的工具,可以忽略这一步,我们需要提前将所需的gcr.io上面的镜像下载到节点上面,当然前提条件是你已经成功安装了docker。
分母为零
2019/07/04
1.8K0
K8s 安装
ingress高可用
介绍 Ingress由两部分组成:Ingress Controller 和 Ingress 服务。
院长技术
2020/06/13
2.4K0
使用kubeadm快速部署一个K8s集群
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。
鱼找水需要时间
2023/08/03
1K0
使用kubeadm快速部署一个K8s集群
Prometheus监控神器-Kubernetes篇(二)
本篇使用StorageClass来持久化数据,搭建Statefulset的Grafana,并且在Dashboard导入前配置前面已经创建好的Prometheus的集群内部访问地址,同时配置ingress-nginx外部访问。
Kubernetes技术栈
2020/09/09
8660
Kubernetes运维之容器编排Deployment动态扩缩容
HPA(Horizontal Pod Autoscaler)的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。
王先森sec
2023/04/24
1.2K0
Kubernetes运维之容器编排Deployment动态扩缩容
Kubernetes-基于RBAC的授权
在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
kubernetes中文社区
2019/06/24
8720
Kubernetes-基于RBAC的授权
coredns_coredns配置域名
网上的coredns.yaml文档都是粘贴复制的,不知所以然,授人以鱼不如授人以渔,官方coredns yaml文件下载地址:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
全栈程序员站长
2022/11/01
1.1K0
k8s中负载均衡器【ingress-nginx】部署
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案:
我的小碗汤
2019/07/30
4.5K0
使用 vmagent 代替 Prometheus 采集监控指标
vmagent 可以帮助我们从各种来源收集指标并将它们存储在 VM 或者任何其他支持 remote write 协议的 Prometheus 兼容的存储系统中。
我是阳明
2022/05/22
3.6K0
使用 vmagent 代替 Prometheus 采集监控指标
Kubernetes 部署 Nebula 图数据库集群
Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
NebulaGraph
2020/02/26
1.1K0
Kubernetes 部署 Nebula 图数据库集群
十分钟搭建好K8S集群
虽然网上有大量从零搭建K8S的文章,但大都针对老版本,若直接照搬去安装最新的1.20版本会遇到一堆问题。故此将我的安装步骤记录下来,希望能为读者提供copy and paste式的集群搭建帮助。
陶辉
2020/12/23
1K0
十分钟搭建好K8S集群
Kubernetes实战之部署ELK Stack收集平台日志
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
没有故事的陈师傅
2019/12/11
5.6K0
ASP.NET Core on K8S深入学习(12)Ingress
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。
Edison Zhou
2020/05/11
1K0
ASP.NET Core on K8S深入学习(12)Ingress
入门K8s:一键脚本搭建Linux服务器集群
好久没有写系列博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用。文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举,方便大家参考。
老张的哲学
2022/04/11
1.6K0
【云原生 | Kubernetes篇】深入了解Ingress(十二)
这是nginx官方做的,适配k8s的,分为开源版和nginx plus版(收费)。
Lansonli
2022/06/15
6270
【云原生 | Kubernetes篇】深入了解Ingress(十二)
相关推荐
cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档