2022-01-18:将数组分成两个数组并最小化数组和的差。
给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 。nums 中每个元素都需要放入两个数组之一。
请你返回 最小 的数组和之差。
输入:nums = [3,9,7,3]。
输出:2。
解释:最优分组方案是分成 [3,9] 和 [7,3] 。
数组和之差的绝对值为 abs((3 + 9) - (7 + 3)) = 2 。
力扣2035。

答案2022-01-18:

分治法。
arr -> 8 0 1 2 3 4 5 6 7
process(arr, 0, 4) [0,4)
process(arr, 4, 8) [4,8)
arr -> 8 0 1 2 3 4 5 6 7
process(arr, 0, 4) [0,4)
process(arr, 4, 8) [4,8)
arr[index…end-1]这个范围上,去做选择
pick挑了几个数!
sum挑的这些数,累加和是多少!
map记录结果
HashMap<Integer, TreeSet> map
key -> 挑了几个数,比如挑了3个数,但是形成累加和可能多个!
value -> 有序表,都记下来!
整个过程,纯暴力!2^15 -> 3万多,纯暴力跑完,依然很快!

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

package main

import (
"fmt"
"math"
"sort"
) func main() {
ret := minimumDifference([]int{3, 9, 7, 3})
fmt.Println(ret)
} func minimumDifference(arr []int) int {
size := len(arr)
half := size >> 1
//HashMap<Integer, TreeSet<Integer>> lmap = new HashMap<>();
lmap := make(map[int]map[int]struct{})
process(arr, 0, half, 0, 0, lmap)
//HashMap<Integer, TreeSet<Integer>> rmap = new HashMap<>();
rmap := make(map[int]map[int]struct{})
process(arr, half, size, 0, 0, rmap)
sum := 0
for _, num := range arr {
sum += num
}
ans := math.MaxInt64
for leftNum, _ := range lmap {
for leftSum, _ := range lmap[leftNum] {
rr := rmap[half-leftNum]
//模拟treeset
rarr := make([]int, 0)
for r, _ := range rr {
rarr = append(rarr, r)
}
sort.Ints(rarr)
ri := NearestIndex2(rarr, (sum>>1)-leftSum)
rightSum := 0
if ri != -1 {
rightSum = rarr[ri]
pickSum := leftSum + rightSum
restSum := sum - pickSum
//ans = Math.min(ans, restSum - pickSum);
if ans > restSum-pickSum {
ans = restSum - pickSum
}
}
}
}
return ans
} // arr -> 8 0 1 2 3 4 5 6 7
// process(arr, 0, 4) [0,4)
// process(arr, 4, 8) [4,8)
// arr[index....end-1]这个范围上,去做选择
// pick挑了几个数!
// sum挑的这些数,累加和是多少!
// map记录结果
// HashMap<Integer, TreeSet<Integer>> map
// key -> 挑了几个数,比如挑了3个数,但是形成累加和可能多个!
// value -> 有序表,都记下来!
// 整个过程,纯暴力!2^15 -> 3万多,纯暴力跑完,依然很快!
func process(arr []int, index int, end int, pick int, sum int, map0 map[int]map[int]struct{}) {
if index == end {
if _, ok := map0[pick]; !ok {
map0[pick] = make(map[int]struct{})
}
map0[pick][sum] = struct{}{}
} else {
process(arr, index+1, end, pick, sum, map0)
process(arr, index+1, end, pick+1, sum+arr[index], map0)
}
} // 在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
}

执行结果如下:


左神java代码

moonfdd

2022-01-18:将数组分成两个数组并最小化数组和的差。 给你一个长度为 2 * n 的整数数组。你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之的更多相关文章

  1. Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)

    E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...

  2. 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...

  3. 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题

    先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数. 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧: #inc ...

  4. php 二维数组按照某value值求出最大值最小值

    //商家的等级信息是一个二维数组,求出最小折扣和最大折扣array(0=>array('levelname'=>'银','dis'=>7.5), 1=>array('level ...

  5. 求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

    求数组的最小值和最大值 //求数组当中最大值和最小值 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; //第一种方法 根据排序方法来求最大值和最小值 ...

  6. 如何求出数组中最小(或者最大)的k个数(least k问题)

    输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...

  7. 求出数组中所有数字的和&&弹出层效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:

    package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...

  9. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  10. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

随机推荐

  1. 如何加密一个sheel脚本!

    脚本写完后,如果要发布给其它人使用的话,可能会因安全原因而受阻,特别是脚本中包含密码等原因,而对脚本加密则可以解决此问题,本文提供了CentOS7/8环境下,加密shell脚本需要安装的程序和方法. ...

  2. getopts解析shell脚本命令行参数

    getopts命令格式 getopts optstring name [arg] optstring为所有可匹配选项组成的字符串,每个字母代表一个选项.如果字母后有冒号:,表明该选项需要选择参数.比如 ...

  3. 一文明白:JavaScript异步编程

    同步和异步 JS是单线程 JavaScript语言的一大特点是单线程,同一时间只能做一件事 (单线程的JS 就是一个傻子,脑子一根筋,做着当前的这件事情,没有完成之前,绝对不会做下一件事情) 当然,这 ...

  4. Javaweb学习笔记第四弹

    JDBC API详解 1.DriverManager作用: 1.注册驱动 registerDriver 2.获取数据库连接 getConnection 参数:1.url jdbc:mysql://lo ...

  5. linux 镜像备份

    linux 镜像备份 使用linux虚拟机的方法 优点 镜像大小比较小 缺点 速度可能比较慢 方法 1.打开虚拟机 我用的ubuntu,读卡器连接电脑虚拟机,ubuntu一般会自动挂载 df -h # ...

  6. day05-2-yaml

    yaml 1.yaml介绍 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发这种语言时,YAML的意思其实是 ...

  7. .NET/C#操作Redis的简单方法

    本文属于Redis初级应用,只起初步引路作用,高手们可略过. 支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linu ...

  8. Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别

    Array VS Slice 数组允许你以特定的顺序在变量中存储相同类型的多个元素. 对于数组来说,最常见的就是迭代数组中的元素. 我们创建一个 Sum 函数,它使用 for 来循环获取数组中的元素并 ...

  9. MySQL 更新执行的过程

    更多内容,前往 IT-BLOG Select语句的执行过程会经过连接器.分析器.优化器.执行器.存储引擎,同样的 Update语句也会同样走一遍 Select语句的执行过程. ​ 但是和 Select ...

  10. vue2双向绑定原理及源码解析

    首先我们要知道VUE实现双向绑定的步骤是什么: 实现一个监听器 Observer 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 sett ...