[Swift]LeetCode1013. 将数组分成和相等的三个部分 | Partition Array Into Three Parts With Equal Sum...
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/10587854.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given an array A
of integers, return true
if and only if we can partition the array into three non-emptyparts with equal sums.
Formally, we can partition the array if we can find indexes i+1 < j
with (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1])
Example 1:
Input: [0,2,1,-6,6,-7,9,1,2,0,1] Output: true Explanation: 0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
Example 2:
Input: [0,2,1,-6,6,7,9,-1,2,0,1] Output: false
Example 3:
Input: [3,3,6,5,-2,2,5,1,-9,4] Output: true Explanation: 3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
Note:
3 <= A.length <= 50000
-10000 <= A[i] <= 10000
给定一个整数数组 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:
输出:[0,2,1,-6,6,-7,9,1,2,0,1] 输出:true 解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
示例 2:
输入:[0,2,1,-6,6,7,9,-1,2,0,1] 输出:false
示例 3:
输入:[3,3,6,5,-2,2,5,1,-9,4] 输出:true 解释:3 + 3 = 6 = 5 - 2 + 2 + 5 + 1 - 9 + 4
提示:
3 <= A.length <= 50000
-10000 <= A[i] <= 10000
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 var sum:Int = 0 4 var n:Int = A.count 5 for i in 0..<n {sum += A[i]} 6 if sum % 3 != 0 {return false} 7 sum /= 3 8 var cnt:Int = 0 9 var ok:Int = 0 10 for i in 0..<n 11 { 12 cnt += A[i] 13 if sum == cnt && ok != 2 14 { 15 cnt = 0 16 ok += 1 17 } 18 } 19 return ok == 2 && sum == cnt 20 } 21 }
364ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 var total = 0 4 for i in 0..<A.count { 5 total = total + A[i] 6 } 7 8 let target = total / 3 9 if total % 3 != 0 { 10 return false 11 } 12 13 var sum = 0 14 var count = 0 15 for i in 0..<A.count { 16 sum = sum + A[i] 17 if sum == target { 18 count = count + 1 19 sum = 0 20 continue 21 } 22 } 23 24 if count == 3 && sum == 0 { 25 return true 26 } 27 28 return false 29 } 30 }
372ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 let count = A.count 4 var sum = 0 5 for item in A { 6 sum = sum + item 7 } 8 guard sum % 3 == 0 else { return false } 9 let part = Int(sum / 3) 10 print(part) 11 var i = -1 12 var j = count 13 var part1 = 0 14 var part2 = 0 15 while i+1<j { 16 i = i + 1 17 j = j - 1 18 var checkPart1 = true 19 if checkPart1 { 20 checkPart1 = false 21 while part1 != part && i < j+1 { 22 part1 = part1 + A[i] 23 i = i + 1 24 } 25 i = i - 1 26 if i+1 > j { 27 return false 28 } 29 } 30 31 var checkPart2 = true 32 if checkPart2 { 33 checkPart2 = false 34 while part2 != part && i < j+1 { 35 part2 = part2 + A[j] 36 j = j - 1 37 } 38 j = j + 1 39 if i+1 > j { 40 return false 41 } 42 } 43 44 if part1 == part2, part1 == part, i < j { 45 return true 46 } 47 } 48 return false 49 } 50 }
376ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 let aSum = A.reduce(0, +) 4 if aSum % 3 != 0 { 5 return false 6 } 7 let expectedSectionSum = aSum / 3 8 var expectedSectionSumSeenCount = 0 9 var currentSectionSum = 0 10 for i in 0..<A.count { 11 let value = A[i] 12 if value == 0 { 13 continue 14 } 15 currentSectionSum += value 16 if currentSectionSum == expectedSectionSum { 17 expectedSectionSumSeenCount += 1 18 currentSectionSum = 0 19 } 20 } 21 return expectedSectionSumSeenCount == 3 22 } 23 }
380ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 let sum = A.reduce(0, +) 4 guard sum % 3 == 0 else { return false } 5 let target = sum / 3 6 var split = [Int](), currSum = 0 7 for i in 0..<A.count { 8 currSum += A[i] 9 if currSum == target { 10 split.append(i) 11 currSum = 0 12 } 13 } 14 return split.count >= 2 && 0 <= split[0] && split[0] < split[1] && split[1] < A.count 15 } 16 }
400ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 guard A.count >= 3 else { 4 return false 5 } 6 7 let sum = A.reduce(0) { $0 + $1 } 8 guard sum % 3 == 0 else { 9 return false 10 } 11 let partition = sum / 3 12 var count = 0 13 var current = 0 14 for a in A { 15 current += a 16 if current == partition { 17 count += 1 18 current = 0 19 } 20 } 21 return count != 0 && count % 3 == 0 22 } 23 }
408ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 var firstSum = 0 4 let total = A.reduce(0, +) 5 for (index, element) in A.enumerated() { 6 firstSum += element 7 let twoSums = total - firstSum 8 if twoSums % 2 == 0 { 9 if twoSums / 2 == firstSum && A.count - index > 2 { 10 let subarray: [Int] = Array(A[index..<A.count]) 11 return validateSecondPart(subarray, withSum: firstSum) 12 } 13 } 14 } 15 return false 16 } 17 18 func validateSecondPart(_ a: [Int], withSum sum: Int) -> Bool { 19 var leftover = a.reduce(0, +) 20 for (index, element) in a.enumerated() { 21 leftover -= element 22 if leftover == sum && a.count - index > 1 { 23 return true 24 } 25 } 26 return false 27 } 28 }
420ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 guard A.count >= 3 else { return false } 4 5 var prefixSums = Array(repeating: 0, count: A.count + 1) 6 7 for (i, num) in A.enumerated() { 8 prefixSums[i + 1] = prefixSums[i] + num 9 } 10 11 let sum = prefixSums.last! 12 13 guard sum % 3 == 0 else { return false } 14 15 let partitionSum = sum / 3 16 17 var a: Int? 18 var b: Int? 19 20 for (i, num) in prefixSums.enumerated() { 21 if num == partitionSum && a == nil { 22 a = i 23 } else if num == (partitionSum * 2) && b == nil && a != nil { 24 b = i 25 return true 26 } 27 } 28 29 return false 30 } 31 }
440ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 if A.count < 3 { 4 return false 5 } 6 if A.count == 3 { 7 return (A[0] == A[1]) && (A[0] == A[2]) && (A[1] == A[2]) 8 } 9 // start for the match. 10 var first = false 11 var second = false 12 var third = false 13 var firstSum = 0 14 var secondSum = 0 15 var thirdSum = 0 16 let totalSum = A.reduce(0,+) 17 if (totalSum % 3) != 0 { 18 return false 19 } 20 for number in A { 21 firstSum += number 22 if !first && (firstSum == (totalSum / 3)) { 23 print("First met") 24 first = true 25 continue 26 } 27 if first && !second{ 28 secondSum += number 29 if secondSum == (totalSum / 3) { 30 print("Second met") 31 second = true 32 continue 33 } 34 } 35 if second { 36 thirdSum += number 37 if thirdSum == (totalSum / 3) { 38 print("Third met") 39 } 40 } 41 } 42 if thirdSum == (totalSum / 3) { 43 return true 44 } 45 return false 46 } 47 }
452ms
1 class Solution { 2 func canThreePartsEqualSum(_ A: [Int]) -> Bool { 3 var prefix: [Int] = [0] 4 prefix.reserveCapacity(A.count + 1) 5 for a in A { 6 prefix.append(prefix.last! + a) 7 } 8 9 var first: Int? 10 var second: Int? 11 12 guard prefix.last! % 3 == 0 else { 13 return false 14 } 15 16 let oneThird = prefix.last! / 3 17 for (i, p) in prefix.enumerated() { 18 if p == oneThird { 19 first = i 20 break 21 } 22 } 23 24 let twoThird = oneThird * 2 25 for (i, p) in prefix.enumerated().reversed() { 26 if p == twoThird { 27 second = i 28 break 29 } 30 } 31 32 if let first = first, 33 let second = second { 34 return first < second 35 } 36 37 return false 38 } 39 }
转载于:https://www.cnblogs.com/strengthen/p/10587854.html
[Swift]LeetCode1013. 将数组分成和相等的三个部分 | Partition Array Into Three Parts With Equal Sum...相关推荐
- python【力扣LeetCode算法题库】1013-将数组分成和相等的三个部分(贪心)
将数组分成和相等的三个部分 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] ...
- LeetCode 1013. 将数组分成和相等的三个部分
1. 题目 给定一个整数数组 A,只有我们可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果我们可以找出索引 i+1 < j 且满足 (A[0] + A[ ...
- leetcode —— 1013. 将数组分成和相等的三个部分
给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + - + A ...
- Swift 字典转数组
Swift 字典转数组 1.Swift 类型的字典(Dictionary) let dic = ["name":"Tom","gender" ...
- Leetcode1712. 将数组分成三个子数组的方案数[C++题解]:双指针和前缀和
文章目录 本题分析 题目链接 本题分析 题目重述: 给定一个非负的数组,要求将其分成3个非空的三段,要求每一段的数字之和依次递增(可以相等),求总共有几种分法. 题目解答: 双指针算法 思路:枚举第二 ...
- php 把一个数组分成有n个元素的二维数组的算法
一.第一种解法 <?php //把一个数组分成几个数组//$arr 是数组//$num 是数组的个数function partition($arr,$num){//数组的个数$listcount ...
- 在Swift中向数组添加元素
本文翻译自:Add an element to an array in Swift Suppose I have an array, for example: 假设我有一个数组,例如: var myA ...
- Lc1013将数组分成相等的三个部分
Lc1013将数组分成相等的三个部分 第一想法就是看看数组所有和是不是能够被3整除,但是i + j < j这个条件没有用上所以感觉不对,但还是提交了,因为想不出出来其他的例子,让编译器给个提示, ...
- 698. 划分为k个相等的子集:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
题目描述 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k ...
最新文章
- 由c#的值类型与引用类型说开去
- 1.11 超过人的表现-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
- soap接口怎么不返回tuple python_Python 中的接口
- 使用CLion构建Qt项目
- 【Django】ImportError: cannot import name 'execute_manager'
- 安卓手机老是自动保存图片_Redmi K30 Pro自动亮度调节和iPhone基本一致,安卓手机的大进步...
- AUTOCAD——圆弧命令
- java 匿名邮件_java开发邮件发送(匿名)
- 解决fatal: unable to access‘‘:GnuTLS recv error
- 学python还是matlab_先学matlab还是python-女性时尚流行美容健康娱乐mv-ida网
- 《Python代码审计》(1)一款超好用的代码扫描工具
- 【Mqtt】基于paho.mqtt.c库的mqtt客户端实现
- STM32F103系列引脚定义-功能图
- 渗透测试CTF-图片隐写的详细教程2(干货)
- jsx中文是什么牌子口红_cl口红是什么牌子 cl口红中文名字
- html如何实现表情加文字发布,vue实现文字表情同时输入的方法
- 文件上传upload.render小记
- uni-app引入自定义图标库——Iconfont-阿里巴巴
- MySQL数据库教程-mysql下载-sqlyog免注册中文下载