zoukankan      html  css  js  c++  java
  • 将数组分成三个和相等的部分的题解

    这条题目是一条比较简单的题目,是博主在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)上下载,下次见。

  • 相关阅读:
    RocketMQ源码分析:(二)消息发送的三种方式
    LTS本地搭建详述
    Mac端解决(含修改8.0.13版的密码):Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    flink入门:01 构建简单运行程序
    rocketmq控制台搭建(rocketmq-console)
    在consul上注册web服务
    将filenames里的每个字符串输出到out文件对象中注意行首的缩进
    spidermark sensepostdata ntp_monlist.py
    HTTP Error 403没有了,但是中文全都是乱码。又是怎么回事?
    original.txt和提交的页面输出的文字的混合文件
  • 原文地址:https://www.cnblogs.com/maoqifansBlog/p/12481864.html
Copyright © 2011-2022 走看看