這條題目是一條比較簡單的題目,是博主在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)上下載,下次見。