# [LeetCode 927. Three Equal Parts](https://leetcode.com/explore/challenge/card/july-leetcoding-challenge-2021/610/week-3-july-15th-july-21st/3817/) ### Daily challenge Jul 17, 2021 (HARD) >You are given an array `arr` which consists of only zeros and ones, divide the array into **three non-empty parts** such that all of these parts represent the same binary value. > >If it is possible, return any **`[i, j]`** with **`i + 1 < j`**, such that: > >* `arr[0], arr[1], ..., arr[i]` is the first part, >* `arr[i + 1], arr[i + 2], ..., arr[j - 1]` is the second part, and >* `arr[j], arr[j + 1], ..., arr[arr.length - 1]` is the third part. >* All three parts have equal binary values. > >If it is not possible, return **`[-1, -1]`**. > >Note that the entire part is used when considering what binary value it represents. For example, `[1,1,0]` represents 6 in decimal, not 3. Also, leading zeros are allowed, so `[0,1,1]` and `[1,1]` represent the same value. :::info **Example 1:** **Input:** arr = [1,0,1,0,1] **Output:** [0,3] ::: :::info **Example 2:** **Input:** arr = [1,1,0,1,1] **Output:** [-1,-1] ::: :::info **Example 3:** **Input:** arr = [1,1,0,0,1] **Output:** [0,2] ::: :::warning **Constraints:** * 3 <= arr.length <= 3 * 104 * arr[i] is 0 or 1 ::: --- ### Approach 1 : :bulb: + :book: **`40 ms ( 63.25% )`** **`O(N)`** 將 `arr` 中 `1` 出現的 index 存入 vector. 出現次數 `numberOfOne = vector.size()`. * `numberOfOne == 0` ---> return **`{0, arr.size()}`**. * `numberOfOne % 3 != 0` ( `1` 無法平均分配到各個 GROUP ) ---> return **`{-1, -1}`**. * `numberOfOne % 3 == 0` ---> TRY VALID PARTITION. **1.** 因為 `1` 需要平均分配到各個 GROUP ( 皆有 `dif = numberOfOne / 3` 個 `1` ),可以先分配每組`最高位的 1` ( **`group{index[0], index[dif], index[2*dif]}`** ),再逐個進行判斷。 | arr | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | NULL | | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | | **GROUP** | | | **[0]** | | | **[1]** | | | **[2]** | | | | **2.** 進行判斷 : >* 是否仍在範圍內 ---> **`group[2] < size`**. >* 三組是否相同 ---> **`arr[group[0]] == arr[group[1]] && arr[group[1]] == arr[group[2]`**. >* 各組 index **`+1`**. | arr | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | NULL | | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | | **GROUP** | | | | **[0]** | | | **[1]** | | | **[2]** | | | **3.** 重複 **`2.`** 的步驟. | arr | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | NULL | | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | | **GROUP** | | | | | **[0]** | | | **[1]** | | | **[2]** | | **4.** **`group[2] == size`** ---> END LOOP | arr | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | NULL | | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | | **GROUP** | | | | | | **[0]** | | | **[1]** | | | **[2]** | >* 若 **`group[2] == size`** ( GOT THE ANSWER ) ---> return **`{group[0] - 1, group[1]}`**. >* 否則 return **`{-1, -1}`**. ```cpp=1 class Solution { public: vector<int> threeEqualParts(vector<int>& arr) { int size = arr.size(); vector<int> index; // count 1 for(int i=0; i<size; i++){ if(arr[i] == 1) index.push_back(i); } int numberOfOne = index.size(); if(numberOfOne % 3 != 0) return vector<int>({-1, -1}); if(numberOfOne == 0) return vector<int>({0, size-1}); int dif = numberOfOne / 3; int group[3] = {index[0], index[dif], index[2*dif]}; // each group's first 1 while(group[2] < size && arr[group[0]] == arr[group[1]] && arr[group[1]] == arr[group[2]]){ for(int j=0; j<3; j++){ group[j]++; } } if(group[2] == size) return vector<int>({group[0]-1, group[1]}); return vector<int>({-1, -1}); } }; ```