將數組分紅三個和相等的部分的題解

這條題目是一條比較簡單的題目,是博主在leetcode上面刷題所遇到的,因此在此記錄一下,但願能幫助到有問題的同窗。ios

首先我要講一下思路:c++

1. 假設數組有n個元素,若這n個元素求和後mod 3 不爲0 則必然表示該數組不能被三等分。git

2. 咱們用全部元素的和除以3,獲得平均值github

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相等,若是有則表示該數組能被三等分,若是沒有,該數組不能被三等分。spa

好了,算法的大體思路就是這樣了,下面我將放上代碼,值得注意的是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)上下載,下次見。code

相關文章
相關標籤/搜索