Descriptions
Given a sequence of integers as an array, determine whether it is possible to obtain a strictly increasing sequence by removing no more than one element from the array.
Note: sequence a0
, a1
, …, an
is considered to be a strictly increasing if a0 < a1 < ... < an
. Sequence containing only one element is also considered to be strictly increasing.
Example
-
For
sequence = [1, 3, 2, 1]
, the output should be
almostIncreasingSequence(sequence) = false
.- There is no one element in this array that can be removed in order to get a strictly increasing sequence.
-
For
sequence = [1, 3, 2]
, the output should be
almostIncreasingSequence(sequence) = true
.- You can remove
3
from the array to get the strictly increasing sequence[1, 2]
. Alternately, you can remove2
to get the strictly increasing sequence[1, 3]
.
- You can remove
Input/Output
-
[execution time limit] 0.5 seconds (cpp)
-
[input] array.integer sequence
- Guaranteed constraints:
2 ≤ sequence.length ≤ 10
5
,-10
5
≤ sequence[i] ≤ 10
5
.
- Guaranteed constraints:
-
[output] boolean
- Return
true
if it is possible to remove one element from the array in order to get a strictly increasing sequence, otherwise returnfalse
.
- Return
Solution
#include <iostream>
#include <vector>
#include <algorithm>
bool almostIncreasingSequence(std::vector<int> sequence) {
// 1. 检查哪个位置,数组变得无序,即 it 之前(不包括)的元素有序
auto it = std::is_sorted_until(sequence.begin(), sequence.end(), [](int x, int y) { return x <= y; });
// 2. 检查 it 后面(包括)的元素是否有序,如果无序,直接返回 false
if (!std::is_sorted(it, sequence.end(), [](int x, int y) { return x <= y; })) {
return false;
};
// 3. 如果无序的位置在 0, 1 和 end - 1 处,则返回 true,位置为 0 表示只有一个元素
if (!(sequence.begin() + 2 <= it && it <= sequence.end() - 2)) {
return true;
}
// 4. 其余情况 (it - 2), (it - 1), (it), (it + 1)
// 因为在 it 处不满足条件,因此需要删除 (it) 或者 (it - 1)
// 若删除 (it),则因满足 (it - 1) < (it + 1)
// 若删除 (it - 1),则因满足 (it - 2) < (it)
if (*(it - 1) < *(it + 1) || *(it - 2) < *it) {
return true;
}
return false;
}
int main() {
std::vector<int> num {3, 5, 67, 98, 3};
std::cout << std::boolalpha << almostIncreasingSequence(num) << std::endl;
return 0;
}