這條題目是一條比較簡單的題目,是博主在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