diff --git a/README.md b/README.md index 6d6f610..39e00fe 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ LeetCode |1779|[Find Nearest Point That Has the Same X or Y Coordinate](https://leetcode.com/problems/find-nearest-point-that-has-the-same-x-or-y-coordinate/) | [C++](./algorithms/cpp/findNearestPointThatHasTheSameXOrYCoordinate/FindNearestPointThatHasTheSameXOrYCoordinate.cpp)|Easy| |1774|[Closest Dessert Cost](https://leetcode.com/problems/closest-dessert-cost/) | [C++](./algorithms/cpp/closestDessertCost/ClosestDessertCost.cpp)|Medium| |1773|[Count Items Matching a Rule](https://leetcode.com/problems/count-items-matching-a-rule/) | [C++](./algorithms/cpp/countItemsMatchingARule/CountItemsMatchingARule.cpp)|Easy| +|1769|[Minimum Number of Operations to Move All Balls to Each Box](https://leetcode.com/problems/minimum-number-of-operations-to-move-all-balls-to-each-box/) | [C++](./algorithms/cpp/minimumNumberOfOperationsToMoveAllBallsToEachBox/MinimumNumberOfOperationsToMoveAllBallsToEachBox.cpp)|Medium| |1768|[Merge Strings Alternately](https://leetcode.com/problems/merge-strings-alternately/) | [C++](./algorithms/cpp/mergeStringsAlternately/MergeStringsAlternately.cpp)|Easy| |1763|[Longest Nice Substring](https://leetcode.com/problems/longest-nice-substring/) | [C++](./algorithms/cpp/longestNiceSubstring/LongestNiceSubstring.cpp)|Easy| |1761|[Minimum Degree of a Connected Trio in a Graph](https://leetcode.com/problems/minimum-degree-of-a-connected-trio-in-a-graph/) | [C++](./algorithms/cpp/minimumDegreeOfAConnectedTrioInAGraph/MinimumDegreeOfAConnectedTrioInAGraph.cpp)|Hard| diff --git a/algorithms/cpp/minimumNumberOfOperationsToMoveAllBallsToEachBox/MinimumNumberOfOperationsToMoveAllBallsToEachBox.cpp b/algorithms/cpp/minimumNumberOfOperationsToMoveAllBallsToEachBox/MinimumNumberOfOperationsToMoveAllBallsToEachBox.cpp new file mode 100644 index 0000000..e4edc2b --- /dev/null +++ b/algorithms/cpp/minimumNumberOfOperationsToMoveAllBallsToEachBox/MinimumNumberOfOperationsToMoveAllBallsToEachBox.cpp @@ -0,0 +1,78 @@ +// Source : https://leetcode.com/problems/minimum-number-of-operations-to-move-all-balls-to-each-box/ +// Author : Hao Chen +// Date : 2021-03-20 + +/***************************************************************************************************** + * + * You have n boxes. You are given a binary string boxes of length n, where boxes[i] is '0' if the ith + * box is empty, and '1' if it contains one ball. + * + * In one operation, you can move one ball from a box to an adjacent box. Box i is adjacent to box j + * if abs(i - j) == 1. Note that after doing so, there may be more than one ball in some boxes. + * + * Return an array answer of size n, where answer[i] is the minimum number of operations needed to + * move all the balls to the ith box. + * + * Each answer[i] is calculated considering the initial state of the boxes. + * + * Example 1: + * + * Input: boxes = "110" + * Output: [1,1,3] + * Explanation: The answer for each box is as follows: + * 1) First box: you will have to move one ball from the second box to the first box in one operation. + * 2) Second box: you will have to move one ball from the first box to the second box in one operation. + * 3) Third box: you will have to move one ball from the first box to the third box in two operations, + * and move one ball from the second box to the third box in one operation. + * + * Example 2: + * + * Input: boxes = "001011" + * Output: [11,8,5,4,3,4] + * + * Constraints: + * + * n == boxes.length + * 1 <= n <= 2000 + * boxes[i] is either '0' or '1'. + ******************************************************************************************************/ + +class Solution { + +public: + vector minOperations(string boxes) { + vector result(boxes.size()); + //minOperations01(boxes, result); //128ms + minOperations02(boxes, result); //4s + return result; + } + + void minOperations01(string& boxes, vector& result ) { + vector balls; + for(int i=0; i& result ) { + //from left to right + for(int i=0, ops=0, balls=0; i< boxes.size(); i++) { + result[i] += ops; + balls += (boxes[i] == '1' ? 1 : 0); + ops += balls; + } + //from right to left + for(int i=boxes.size()-1, ops=0, balls=0; i>=0; i--) { + result[i] += ops; + balls += (boxes[i] == '1' ? 1 : 0); + ops += balls; + } + } +};