Skip to content

Commit

Permalink
New Problem "Arithmetic Slices"
Browse files Browse the repository at this point in the history
  • Loading branch information
haoel committed Nov 13, 2016
1 parent c54086b commit e7e1252
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ LeetCode
| # | Title | Solution | Difficulty |
|---| ----- | -------- | ---------- |
|415|[Add Strings](https://leetcode.com/problems/add-strings/) | [C++](./algorithms/cpp/addStrings/AddStrings.cpp)|Easy|
|414|[Third Maximum Number](https://leetcode.com/problems/third-maximum-number/) | [C++](./algorithms/cpp/thirdMaximumNumber/ThirdMaximumNumber.cpp)|Easy|
|413|[Arithmetic Slices](https://leetcode.com/problems/arithmetic-slices/) | [C++](./algorithms/cpp/arithmeticSlices/ArithmeticSlices.cpp)|Medium|
|406|[Queue Reconstruction by Height](https://leetcode.com/problems/queue-reconstruction-by-height/) | [C++](./algorithms/cpp/queueReconstructionByHeight/QueueReconstructionByHeight.cpp)|Medium|
|405|[Convert a Number to Hexadecimal](https://leetcode.com/problems/convert-a-number-to-hexadecimal/) | [C++](./algorithms/cpp/convertANumberToHexadecimal/ConvertANumberToHexadecimal.cpp)|Easy|
|404|[Sum of Left Leaves](https://leetcode.com/problems/sum-of-left-leaves/) | [C++](./algorithms/cpp/sumOfLeftLeaves/SumOfLeftLeaves.cpp)|Easy|
Expand Down
72 changes: 72 additions & 0 deletions algorithms/cpp/arithmeticSlices/ArithmeticSlices.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Source : https://leetcode.com/problems/arithmetic-slices/
// Author : Hao Chen
// Date : 2016-11-13

/***************************************************************************************
*
* A sequence of number is called arithmetic if it consists of at least three elements
* and if the difference between any two consecutive elements is the same.
*
* For example, these are arithmetic sequence:
* 1, 3, 5, 7, 9
* 7, 7, 7, 7
* 3, -1, -5, -9
*
* The following sequence is not arithmetic. 1, 1, 2, 5, 7
*
* A zero-indexed array A consisting of N numbers is given. A slice of that array is
* any pair of integers (P, Q) such that 0
*
* A slice (P, Q) of array A is called arithmetic if the sequence:
* A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means
* that P + 1
*
* The function should return the number of arithmetic slices in the array A.
*
* Example:
*
* A = [1, 2, 3, 4]
*
* return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4]
* itself.
***************************************************************************************/

class Solution {
public:
//
// It's easy to find out how many 3-length slices in an arithmetic array with N length.
//
// len = 3, then 1 slices, sum(1)
// len = 4, then 3 slices, sum(1,2) - TWO 3-length slices + ONE 4-length slice
// len = 5, then 6 slices, sum(1,2,3) - THREE 3-length slices + TWO 4-length slices + ONE 5-length slice
// len = 6, then 10 slices, sum(1,2,3,4) - ...
// len = 7, then 15 slices, sum(1,2,3,4,5) - ..
//
// So, with N length arithmetic array, there are Sum[1, N-3+1] 3-length slices
//
// And, we know the formula sum from 1 to n is:
//
// n * ( n + 1 )
// sum [1, n] = ---------------
// 2
// Then, we could have the solution - O(n) Time with O(1) Space
//

int sum1toN(int n) {
return n * (n+1) / 2;
}

int numberOfArithmeticSlices(vector<int>& A) {
int result = 0;
int len = 0; // the current length of arithmetic
for (int i=2; i<A.size(); i++) {
if (A[i] - A[i-1] == A[i-1] - A[i-2]) {
len++;
}else{
result += sum1toN(len);
len=0;
}
}
return len==0 ? result : result + sum1toN(len);
}
};
51 changes: 51 additions & 0 deletions algorithms/cpp/thirdMaximumNumber/ThirdMaximumNumber.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Source : https://leetcode.com/problems/third-maximum-number/
// Author : Hao Chen
// Date : 2016-11-12

/***************************************************************************************
*
* Given a non-empty array of integers, return the third maximum number in this array.
* If it does not exist, return the maximum number. The time complexity must be in O(n).
*
* Example 1:
*
* Input: [3, 2, 1]
*
* Output: 1
*
* Explanation: The third maximum is 1.
*
* Example 2:
*
* Input: [1, 2]
*
* Output: 2
*
* Explanation: The third maximum does not exist, so the maximum (2) is returned
* instead.
*
* Example 3:
*
* Input: [2, 2, 3, 1]
*
* Output: 1
*
* Explanation: Note that the third maximum here means the third maximum distinct
* number.
* Both numbers with value 2 are both considered as second maximum.
***************************************************************************************/

class Solution {
public:
int nMax(vector<int>& nums, int n) {
set<int> topN;
for(auto num : nums) {
topN.insert(num);
if (topN.size() > n) topN.erase(topN.begin());
}
return (topN.size() >= n) ? *(topN.begin()) : *(topN.rbegin());
}
int thirdMax(vector<int>& nums) {
return nMax(nums, 3);
}
};

0 comments on commit e7e1252

Please sign in to comment.