Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-01-18:将数组分成两个数组并最小化数组和的差。 给

2022-01-18:将数组分成两个数组并最小化数组和的差。 给

原创
作者头像
福大大架构师每日一题
发布于 2022-01-18 14:24:25
发布于 2022-01-18 14:24:25
6990
举报

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)

arrindex....end-1这个范围上,去做选择

pick挑了几个数!

sum挑的这些数,累加和是多少!

map记录结果

HashMap<Integer, TreeSet<Integer>> map

key -> 挑了几个数,比如挑了3个数,但是形成累加和可能多个!

value -> 有序表,都记下来!

整个过程,纯暴力!2^15 -> 3万多,纯暴力跑完,依然很快!

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

代码语言:go
AI代码解释
复制
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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么微服务一定要有网关?
2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
JAVA高级架构开发
2018/10/15
8950
Spring Cloud(六)服务网关 zuul 快速入门
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。 路由在微服务体系结构的一个组成部分。例如,/可以映射到您的Web应用程序,/api/users映射到用户服务,并将/api/shop映
程序员鹏磊
2018/02/09
1.2K0
Spring Cloud(六)服务网关 zuul 快速入门
何为微服务、网关、服务发现/注册?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
1.2K0
微服务网关
网关具有的职责如: 身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 当然,最主要的职责还是与“外界联系”。
Java_慈祥
2024/08/06
2690
微服务网关
「 从0到1学习微服务SpringCloud 」10 服务网关Zuul
为什么需要服务网关 假如当前有十几个微服务服务,订单,商品,用户等等,那客户端需要和每个服务逐一打交道?这显然是不现实的,这就需要有一个统一入口,它就是服务网关。 常用的网关方案 Nginx + L
KEN DO EVERTHING
2019/04/24
5760
「 从0到1学习微服务SpringCloud 」10 服务网关Zuul
微服务中网关(API Gateway)的技术选型
用 Spring Cloud 微服务实战中,大家都知道用 Zuul 作为智能网关。API 网关(API Gateway)主要负责服务请求路由、组合及协议转换。下面是大家的总结:
天涯泪小武
2019/06/26
7.6K0
独家|微服务网关组件在金融的实践
随着车金融业务的快速发展,单体架构的系统已经不能满足业务的快速发展的需要,在这种情况下,本文主要介绍微服务网关在金融的实践与演进过程。
Bug开发工程师
2020/02/24
9290
微服务架构之「 API网关 」
在微服务架构的系列文章中,前面已经通过文章《架构设计之「服务注册 」》介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」。
奎哥
2019/05/09
6590
微服务架构之「 API网关 」
其实,对于微服务网关的主要功能和技术选型,你还需要深入理解下
微服务网关作为微服务后端服务的统一入口(Entry Point),它可以统筹管理后端服务,主要分为数据平面(Data Plane)和控制平面(Control Plane)。
愿天堂没有BUG
2022/10/28
9960
其实,对于微服务网关的主要功能和技术选型,你还需要深入理解下
《吃透微服务》 - 服务网关之Gateway
一个希望能够成为 吹着牛X谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤单!
蔡不菜丶
2021/06/29
7480
微服务技术栈:API网关中心,落地实现方案
客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用:
知了一笑
2020/08/25
1K0
微服务技术栈:API网关中心,落地实现方案
快速学习-Gateway--服务网关
大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调 用。
cwl_java
2020/09/01
8070
快速学习-Gateway--服务网关
原创好文!亿级流量网关设计思路
本文准备围绕七个点来讲网关,分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。
cxuan
2021/03/12
2K0
这样讲API网关,你应该能明白了吧!
为了提高系统的性能和可靠性,将应用服务进行拆分微服务化。作为系统入口的 API 网关也逐渐成为了标配。
macrozheng
2019/11/07
1.3K0
这样讲API网关,你应该能明白了吧!
微服务架构Day22-SpringCloud之网关
在微服务中应该将路由规则配置在SpringCloud Config分布式配置中心,实现动态路由规则.
攻城狮Chova
2022/01/22
3730
Spring Boot + Spring Cloud 构建微服务系统(七):API服务网关(Zuul)
前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡,那我们的各种微服务又要如何提供给外部应用调用呢。
朝雨忆轻尘
2019/06/19
6180
Spring Boot + Spring Cloud 构建微服务系统(七):API服务网关(Zuul)
Spring Cloud构建微服务架构:服务网关(过滤器)【Dalston版】
在前两篇文章:服务网关(基础)、服务网关(路由配置)中,我们了解了Spring Cloud Zuul作为网关所具备的最基本功能:路由。本文我们将具体介绍一下Spring Cloud Zuul的另一项核心功能:过滤器。 过滤器的作用 通过上面所述的两篇我们,我们已经能够实现请求的路由功能,所以我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口都对它们开放。然而,目前的服务路
程序猿DD
2018/03/21
7410
微服务网关Zuul迁移到Spring Cloud Gateway
在之前的文章中,我们介绍过微服务网关Spring Cloud Netflix Zuul,前段时间有两篇文章专门介绍了Spring Cloud的全新项目Spring Cloud Gateway,以及其中的过滤器工厂。本文将会介绍将微服务网关由Zuul迁移到Spring Cloud Gateway。
aoho求索
2018/10/23
1.8K0
微服务网关Zuul迁移到Spring Cloud Gateway
微服务架构开发实战:API网关意义和常见API网关的实现方式
API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。
愿天堂没有BUG
2022/10/28
1.6K0
微服务架构开发实战:API网关意义和常见API网关的实现方式
SpringCloud微服务实战(十一)-微服务网关及其实现原理(Zuul为例讲解)
随着服务数量增多,如果还是每个服务都直接对外部客户端提供接口,就会变得很复杂,最显然的就是每个服务都得自己实现鉴权。 这时,就需要一个角色充当 request 请求的统一入口,即服务网关。 业务接口通过API网关暴露,是所有客户端接口的唯一入口。 微服务之间的通信也通过API网关。
JavaEdge
2021/02/22
6260
SpringCloud微服务实战(十一)-微服务网关及其实现原理(Zuul为例讲解)
推荐阅读
相关推荐
为什么微服务一定要有网关?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档