Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode1013:将数组分成和相等的三个部分

LeetCode1013:将数组分成和相等的三个部分

作者头像
机智的程序员小熊
发布于 2020-03-25 03:28:52
发布于 2020-03-25 03:28:52
1.8K00
代码可运行
举报
文章被收录于专栏:技术面面观技术面面观
运行总次数:0
代码可运行

前言

本系列文章为《leetcode》刷题笔记。

题目位置:https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/

项目位置:我的Github项目 https://github.com/pzqu/LeetCode

题目

给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false

形式上,如果可以找出索引i+1 < j且满足(A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1])就可以将数组三等分。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出:[0,2,1,-6,6,-7,9,1,2,0,1]
输出:true
解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:[0,2,1,-6,6,7,9,-1,2,0,1]
输出:false

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:[3,3,6,5,-2,2,5,1,-9,4]
输出:true
解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4

提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3 <= A.length <= 50000
-10^4 <= A[i] <= 10^4
思路

题目要点:

  1. 原数组砍成三段,每段是连续的
  2. 每段的和相等
  3. 总和/3就是每段的和

方法一:暴力破解

最直观的想法就暴力破解,要把一个线段砍成三段,那必然有两条分隔线,所以有两个循环来改变分隔线的位置。

第一个分隔线由i表示,切分开第一段和第二段,从0开始,最多到len(A)-2,因为后面两段至少要有一个值。区间为[0,i]

第二个分隔线由j表示,切开第二段和第三段,从1开始,给第一段至少一个值,给第最后一段,至少一个值。区间为[i+1,j],最后一个区间为[j+1,len(A)-1]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 for i := 0; i < len(A)-2; i++ {
        ....
        for j := i + 1; j < len(A)-1; j++ {

这样三段的和为suma,sumb,sumc ,起始值为0

为了减少循环次数,不要每次改变长度都重新加一次sumc,只要先统计一次第三段的和赋值给tmpsumc留给后面用,每次增加第一段长度就给第二段长度清零,第三段总和等于 tmpsumc

每次前两段长度增加的时候,sumc剪去j新包含的数即可,如下第二层循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for j := i + 1; j < len(A)-1; j++ {
            sumb = sumb + A[j]
            sumc = sumc - A[j]
            ......

每次第二段长度增加1、第三段长度减少1,都要进行一次判断是否三个和相等。

如果第二段和第三段各自的和都和第一段不相等,那就先将第三段总和tmpsumc - A[i+1],让第一段长度加1,第二段长度清零

但是速度很慢:

方法二 :数学

这真的是一个数学题,如果已知总和,由于三段长度相等,只要找到前两段,那第三段一定相等。

所以有如下代码统计总和

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i := 0; i < len(A); i++ {
        sum = sum + A[i]
    }

如果被3除不尽则失败

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum%3 != 0

找出前两段,count是统计次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i := 0; i < len(A); i++ {
        tmpSum = tmpSum + A[i]
        if tmpSum == singeSum {
            count = count + 1
            tmpSum = 0
            if count == 2 && i < len(A)-1 {
                return true
            }
        }
    }

其中count == 2 && i < len(A)-1是保证第三段至少有一个数

ps: 有人会问了,因为数组有正有负,如果我找到了更长的第一段怎么办?

第二段的位置总是在第一段后面的,第一段再长,都是小于第二段的长度的,总和我们都求出来了,只要找到第一段就好啦。

但如果你选择了更大的下标(不妨叫做 i1),可能就没有对应的满足要求的 j 了,所以选最小的是最安全的。只要第一段找到了,后面两段的和必然是sum/3 * 2,找得到就是,找不到就没了。

代码

方法一:暴力破解

Go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func canThreePartsEqualSum(A []int) bool {
    suma, sumb, sumc := 0, 0, 0
    tmpsumc := 0

    for k := 1; k < len(A); k++ {
        tmpsumc = tmpsumc + A[k]
    }

    for i := 0; i < len(A)-2; i++ {
        suma = suma + A[i]
        sumb = 0
        sumc = tmpsumc
        for j := i + 1; j < len(A)-1; j++ {
            sumb = sumb + A[j]
            sumc = sumc - A[j]
            if suma == sumb && sumb == sumc {
                return true
            }
        }

        tmpsumc = tmpsumc - A[i+1]
    }
    return false
}

方法二 :数学 Go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func canThreePartsEqualSum(A []int) bool {
    tmpSum, sum, singeSum, count := 0, 0, 0, 0

    for i := 0; i < len(A); i++ {
        sum = sum + A[i]
    }
    if sum%3 != 0 {
        return false
    }
    singeSum = sum / 3

    for i := 0; i < len(A); i++ {
        tmpSum = tmpSum + A[i]
        if tmpSum == singeSum {
            count = count + 1
            tmpSum = 0
            if count == 2 && i < len(A)-1 {
                return true
            }
        }
    }
    return false
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机智的程序员小熊 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
LeetCode-面试题14-1-剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]k[1]...k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
benym
2022/07/14
2550
笑不活了,银行赞助的 LeetCode 周赛,题目是适合打劫银行的日子
今天 LeetCode 的每日一题是第 2100 号问题:适合打劫银行的日子,我打开评论区一看,我也笑不活了。
五分钟学算法
2022/04/08
4310
笑不活了,银行赞助的 LeetCode 周赛,题目是适合打劫银行的日子
剑指 Offer 14- I. 剪绳子
大家好,我是程序员吴师兄,欢迎来到 图解剑指 Offer 结构化专栏,在这个专栏里我将和大家一起学习如何用结构化的思维来思考、解题、写代码,希望能帮助你即使在面试的时候紧张也能做对。
五分钟学算法
2021/04/20
7890
剑指 Offer 14- I. 剪绳子
【好书推荐】《剑指Offer》之硬技能(编程题12~16)
题目:请设计一个函数,用来判断一个矩阵中是否存在一条包含其字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
用户1148394
2019/06/21
3770
ETAP软件–可靠性计算
各元件可靠性参数如下: 架空线路故障停运率(次/百公里) 55.865 架空线路停电平均持续时间(小时) 4.1622 断路器故障停运率(次/百台) 1.699 断路器停电平均持续时间(小时) 4.8864 开关故障停运率(次/百台) 54.677 开关停电平均持续时间(小时) 1.9361
全栈程序员站长
2022/09/15
5830
ETAP软件–可靠性计算
【TCP/IP】图解TCP的通信机制
TCP(Transmission Control Protocol)是传输控制协议,其作用于传输层,是一种提供了面向连接通信服务的协议
@零一
2021/01/29
1.5K0
LeetCode 160: 相交链表 Intersection of Two Linked Lists
Write a program to find the node at which the intersection of two singly linked lists begins.
爱写bug
2019/07/19
2970
新160个CrackMe分析-第2组:11-20(下)
Delphi程序,截图不方便注释,之后用IDR直接复制代码到everEdit里写注释了:
极安御信安全研究院
2022/09/08
5550
新160个CrackMe分析-第2组:11-20(下)
数据结构与算法 --- 复杂度分析专题(一)
算法复杂度分析的意义在于评估算法的执行效率,找出最优解决方案,是优化算法和改进程序性能的基础。通过对算法的时间复杂度和空间复杂度进行分析,可以帮助我们预估该算法运行所需的资源,从而提高程序的性能。
Niuery Diary
2023/10/22
3730
数据结构与算法 --- 复杂度分析专题(一)
我 AK 了一场欧洲的算法竞赛,直呼过瘾!
The Benelux Algorithm Programming Contest (BAPC) 是一项集中了来自卢森堡、比利时和荷兰的顶尖大学的约 50 支队伍的算法竞赛。
ACM算法日常
2021/11/17
7680
Android绘图最终篇之大战贝塞尔三次曲线
零、前言 1.可以说贝塞尔曲线是一把 "石中剑",能够拔出它,会让你的绘图如虎添翼。 2.今天要与贝塞尔曲线大战三百回合,将它加入我的绘图大军麾下。 3.自此Android绘图五虎将:Canvas,Path,Paint,Color,贝塞尔便集结完成。 4.本项目源码见文尾捷文规范第一条,视图源码在view包,分析工具在analyze包 ---- 一、贝塞尔三次曲线初体验 1.无网格,不曲线,废话不多说,上网格+坐标系 /** * 作者:张风捷特烈<br/> * 时间:2018/11/16 0
张风捷特烈
2018/11/21
8080
2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = {
第四行有4个整数La,Ra,Lb,Rb,范围在0到10^18之间,代表题目描述中的参数。
福大大架构师每日一题
2023/09/02
2610
2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = {
AcWing 562. 壁画(每日一题)
在接下来的每一天,他只能选择与绘制完成的墙面相邻的墙段进行作画,因为他不想分开壁画。
摆烂小白敲代码
2024/09/23
950
查表得省一!
空间、时间都是 O(1) 级别,打表法 YYDS,比赛必备的神器,想在比赛中得奖,还真得用这种技巧。
五分钟学算法
2022/04/08
5000
查表得省一!
https下不加www的301强制跳转
不少浏览器都开始逐渐更新至只支持https的网站,所以很多http网站都需要添加对https的支持,这时就需要涉及到www和不加www的跳转问题,由于www和不加www使用的是不同的证书,所以需要做301跳转处理,方案如下:
星哥玩云
2022/07/13
1.4K0
2015年ccf计算机职业认证资格考试第一题数列分段
  输入的第一行包含一个整数n,表示数列中整数的个数。   第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔。
glm233
2020/09/28
4280
一道非常经典的队列题
今天发一道剑指offer上面的经典题目,主要考察面试者的知识迁移能力,下面我们先来看一下题目描述。
灵魂画师牧码
2020/11/13
6070
一道非常经典的队列题
前端学数据结构与算法(一):不会复杂度分析,算法等于白学
兜兜转转了这么久,数据结构与算法始终是逃不过命题。曾几何时,前端学习数据结构与算法,想必会被认为不务正业,但现今想必大家已有耳闻与经历,面试遇到链表、树、爬楼梯、三数之和等题目已经屡见不鲜。想进靠谱大厂算法与数据结构应该不止是提上日程那么简单,可能现在已经是迫在眉睫。这次决定再写一个系列也只是作为我这段时间的学习报告,也不绝对不会再像我之前的vue原理解析那般断更了,欢迎大家监督~
飞跃疯人院
2020/10/07
9350
算法基础之复杂度表示
今天聊聊算法,算法作为开发过程中重要的一份子,是我们编码的基础,遇到问题如果没有好的算法解决,程序也就没有好的性能可言了。所以好的算法,能让代码更省时间和空间,那怎么去计算算法所占用的时间和空间呢?这也就是我们今天要重点说的东西了——空间复杂度和时间复杂度。
码上积木
2021/01/11
5550
丫丫考了100分_小明考了0分
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135113.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2030
推荐阅读
相关推荐
LeetCode-面试题14-1-剪绳子
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验