-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path15_Adjacent_Increasing_Subarrays_Detection_II.cpp
More file actions
66 lines (48 loc) · 2 KB
/
Copy path15_Adjacent_Increasing_Subarrays_Detection_II.cpp
File metadata and controls
66 lines (48 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 3350. Adjacent Increasing Subarrays Detection II
// Given an array nums of n integers, your task is to find the maximum value of k for which there exist two adjacent subarrays of length k each, such that both subarrays are strictly increasing. Specifically, check if there are two subarrays of length k starting at indices a and b (a < b), where:
// Both subarrays nums[a..a + k - 1] and nums[b..b + k - 1] are strictly increasing.
// The subarrays must be adjacent, meaning b = a + k.
// Return the maximum possible value of k.
// A subarray is a contiguous non-empty sequence of elements within an array.
// Example 1:
// Input: nums = [2,5,7,8,9,2,3,4,3,1]
// Output: 3
// Explanation:
// The subarray starting at index 2 is [7, 8, 9], which is strictly increasing.
// The subarray starting at index 5 is [2, 3, 4], which is also strictly increasing.
// These two subarrays are adjacent, and 3 is the maximum possible value of k for which two such adjacent strictly increasing subarrays exist.
// Example 2:
// Input: nums = [1,2,3,4,4,4,4,5,6,7]
// Output: 2
// Explanation:
// The subarray starting at index 0 is [1, 2], which is strictly increasing.
// The subarray starting at index 2 is [3, 4], which is also strictly increasing.
// These two subarrays are adjacent, and 2 is the maximum possible value of k for which two such adjacent strictly increasing subarrays exist.
// Constraints:
// 2 <= nums.length <= 2 * 105
// -109 <= nums[i] <= 109
class Solution
{
public:
int maxIncreasingSubarrays(vector<int> &nums)
{
int n = nums.size();
int up = 1, preUp = 0, res = 0;
for (int i = 1; i < n; i++)
{
if (nums[i] > nums[i - 1])
up++;
else
{
preUp = up;
up = 1;
}
int half = up >> 1;
int m = min(preUp, up);
int candidate = max(half, m);
if (candidate > res)
res = candidate;
}
return res;
}
};