将数组分成三个和相等的部分的题解
2020-03-12 16:02:33来源:博客园 阅读 ()
将数组分成三个和相等的部分的题解
这条题目是一条比较简单的题目,是博主在leetcode上面刷题所遇到的,所以在此记录一下,希望能帮助到有问题的同学。
首先我要讲一下思路:
1. 假设数组有n个元素,若这n个元素求和后mod 3 不为0 则必然表示该数组不能被三等分。
2. 我们用所有元素的和除以3,得到平均值
3. 用left 表示数组的开始,right 表示数组的结束部分,并用left_sum表示数组左部分的和,right_sum 表示数组右部分的和,设定一个bool值表示是否left_sum和right_sum相等,并默认为false
4. 当left 指针小于right指针时,我们不断迭代,并且分别将从左右两端迭代的值累加到left_sum和right_sum 上面,直到 两者相等且等于平均值,这时我们设定预定义的bool值为true并退出循环
5. 循环结束后我们还要判断left和 right 之间是否至少有一个空间保证有第三个值和left_sum以及right_sum相等,如果有则表示该数组能被三等分,如果没有,该数组不能被三等分。
好了,算法的大致思路就是这样了,下面我将放上代码,值得注意的是vector<int> v= {1,2,3,4,5} 这样的语句在c++ 11 之后才可以正确运行希望大家注意。
1 #include <iostream> 2 #include <numeric> 3 #include <stdio.h> 4 #include <vector> 5 using namespace std; 6 7 class Solution 8 { 9 public: 10 bool canThreePartsEqualSum(vector<int> &A) 11 { 12 int sum = accumulate(A.begin(), A.end(), 0); // 求和 13 if (sum % 3 != 0) 14 return false; // 对三求余等于0表示数组不能被三等分 15 int avg = sum / 3; // 获得平均数 16 int left = 0, right = A.size() - 1; // 获得左右指针 17 int left_sum = 0, right_sum = 0; // 初始化左右和为空 18 bool flag = false; // 判断是否能计算出左右和相等的情况 19 while (left < right) 20 { // 当左指针小于右边时继续循环 21 if (left_sum != avg) 22 { // 若左边的和小于平均数, 向右累加 23 left_sum += A.at(left++); 24 } 25 if (right_sum != avg) 26 { // 若右边的和小于平均数, 向左累加 27 right_sum += A.at(right--); 28 } 29 if (left_sum == avg && right_sum == avg) 30 { // 如果左右的和都等于平均数, 跳出循环 31 flag = true; 32 break; 33 } 34 } 35 return flag && right - left > 1; // 当左右和相等且左右指针中间最少有一个空间时,表示该数组能被三等分 36 } 37 }; 38 int main(void){ 39 Solution *s = new Solution(); 40 vector<int>v = {3,3,6,5,-2,2,5,1,-9,4}; 41 bool result = s->canThreePartsEqualSum(v); 42 cout<<"该数组"<<(result?"能":"不能")<<"被三等分"<<endl; 43 }
好了以上就是这次随笔的内容了,源代码可以从我的github(https://github.com/maoqifan1/leetcode.git)上下载,下次见。
原文链接:https://www.cnblogs.com/maoqifansBlog/p/12481864.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C++之策略模式
- 纯虚函数与基类指针数组的运用 代码参考 2020-04-30
- STL之deque 2020-04-29
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- 寻找两个有序数组的中位数 2020-04-09
- STL之vector 2020-04-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash