2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。

福哥答案2020-02-25:

自然智慧即可。

1.递归。有代码。

2.动态规划。dp是三维数组。有代码。

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

package main

import "fmt"

const INT_MAX = int(^uint(0) >> 1)
const INT_MIN = ^INT_MAX func main() {
arr := []int{1, 2, 3, 4, 100}
ret := right1(arr)
fmt.Println("1.递归:", ret)
ret = right2(arr)
fmt.Println("2.动态规划:", ret)
} func right1(arr []int) int {
if len(arr) < 2 {
return 0
}
sum := 0
for _, v := range arr {
sum += v
}
if len(arr)&1 == 0 {
return process1(arr, 0, len(arr)/2, sum/2)
} else {
ret1 := process1(arr, 0, len(arr)/2, sum/2)
ret2 := process1(arr, 0, len(arr)/2+1, sum/2)
if ret1 < ret2 {
return ret2
} else {
return ret1
}
}
}
func process1(arr []int, i int, picks int, rest int) int {
if i == len(arr) {
if picks == 0 {
return 0
} else {
return -1
}
} else {
p1 := process1(arr, i+1, picks, rest)
p2 := -1
next := -1
if arr[i] <= rest {
next = process1(arr, i+1, picks-1, rest-arr[i])
}
if next != -1 {
p2 = arr[i] + next
}
return GetMax(p1, p2)
}
} func right2(arr []int) int {
if len(arr) < 2 {
return 0
}
sum := 0
for _, v := range arr {
sum += v
}
sum >>= 1
N := len(arr)
M := (len(arr) + 1) >> 1
dp := make([][][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([][]int, M+1)
for j := 0; j < M+1; j++ {
dp[i][j] = make([]int, sum+1)
for k := 0; k < sum+1; k++ {
dp[i][j][k] = INT_MIN
}
}
}
for i := 0; i < N; i++ {
for k := 0; k <= sum; k++ {
dp[i][0][k] = 0
}
}
for k := 0; k <= sum; k++ {
if arr[0] <= k {
dp[0][1][k] = arr[0]
} else {
dp[0][1][k] = INT_MIN
}
} for i := 1; i < N; i++ {
for j := 1; j <= GetMin(i+1, M); j++ {
for k := 0; k <= sum; k++ {
dp[i][j][k] = dp[i-1][j][k]
if k-arr[i] >= 0 {
dp[i][j][k] = GetMax(dp[i][j][k], dp[i-1][j-1][k-arr[i]]+arr[i])
}
}
}
}
return GetMax(dp[N-1][M][sum], dp[N-1][N-M][sum])
} func GetMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
func GetMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

评论

2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。的更多相关文章

  1. 你与优秀源码之间只差一个 Star

    fir.im Weekly - 你与优秀源码之间只差一个 Star   说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者 ...

  2. 你离高薪 offer 只差一个Redis入门,我是认真的

    说起来,可能有些小伙伴会不相信,我是第一次用 Redis,真的.因为公司小,业务量小,Redis 根本派不上用场.不过,最近打算把系统升级一下,顺带把当下时髦的技术入个门,"与时俱进&quo ...

  3. 成为数据专家,你只差一个Quick Insights的距离

    身处如今的大数据时代,你真的知道如何处理数据和分析数据吗?或许那些被你忽视的数据背后就暗藏着重要的商业灵感.并非人人都是数据专家,有时候你需要一些专业的软件来帮你处理数据.那么如何能快速.准确地从数据 ...

  4. fir.im Weekly - 你与优秀源码之间只差一个 Star

    说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者心生向往.那么如何正确的使用 Github,也许是编程学习之必要.来看下 ...

  5. 你与论文达人只差一个MathType的距离

    在理工类的论文文档中总是少不了数学公式的出现,各种符号夹杂在期间导致论文在编写时总是会出现各种各样的问题.但是这些问题在论文达人们手中全都不是事儿!分分钟搞定你数学公式上出现的问题!论文达人们是怎么搞 ...

  6. 在O(N)时间内求解 正数数组中 两个数相加的 最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...

  7. 高并发情况下Linux系统及kernel参数优化

    众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参数方面和IO事件分配机制等.下面就从几方面来调整使Linux系统能够支持高并发环境. Iptabl ...

  8. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  9. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  10. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

随机推荐

  1. DRF_序列化and反序列化之高级

    1. source用法 序列化器内的使用 book_name = serializers.CharField(max_length=8, min_length=3,source='name')这个用来 ...

  2. 人脸关键点的应用场景及重难点解析丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网视频组 AI 算法工程师 周世付. 人脸检测.人脸关键点检测,是计算机视觉的基础算法.许多酷炫应用背后,例如美颜.贴纸.人脸驱动 avatar ...

  3. CSPS2019 括号树 题解

    链的部分分 我们设f[i]表示以i结尾的括号序列有多少个,那么i的实际答案就是f的前缀和 显然,所有左括号和不能匹配的右括号的f均为0 对于每一个能匹配的右括号i,我们找到与之匹配的左括号p,以i结尾 ...

  4. Redis-Cluster常用命令

    CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息. //节点 CLUSTER MEET <ip> < ...

  5. EF Core如何使用DbFirst

    首先安装好 Microsoft.EntityFrameworkCore.SqlServer   [ef 的数据库驱动程序 如果是其他数据库这个要换成对应的数据库驱动] Microsoft.Entity ...

  6. SpringBoot 启动类的原理

    SpringBoot启动类上使用 @SpringBootApplication注解,该注解是一个组合注解,包含多个其它注解.和类定义(SpringApplication.run)要揭开 SpringB ...

  7. C++ 浮点数比较代码

    #include <algorithm> #include <cmath> #include <iostream> // 如果 a 和 b 之间的差异在 a 和 b ...

  8. PyQt5学习 (4)--QAbstractButton(下)

    QAbstractBUtton:   所有按钮控件的基类   提供按钮的通用功能   继承自QWidget   属于抽象类别,不能直接去使用,必须借助于子类(除非你觉得子类不够用,想自定义一个按钮) ...

  9. Flutter 下载篇 - 叁 | 网络库切换实践与思考

    前言 本文是关于使用flutter_download_manager下载功能的实践和探索.我们将基于flutter_download_manager的功能扩展,改造成自己想要的样子.在阅读本文之前,建 ...

  10. 二进制安装Kubernetes(k8s) v1.22.10 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.22.10 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更 ...