Skip to content

Commit 0071e36

Browse files
committed
2334 added.
1 parent 5c15b1f commit 0071e36

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
project(D)
3+
4+
set(CMAKE_CXX_STANDARD 14)
5+
6+
add_executable(D main.cpp)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/// Source : https://leetcode.com/problems/subarray-with-elements-greater-than-varying-threshold/
2+
/// Author : liuyubobobo
3+
/// Time : 2022-07-09
4+
5+
#include <iostream>
6+
#include <vector>
7+
8+
using namespace std;
9+
10+
11+
/// Divide and Conquer
12+
/// Time Complexity: O(nlogn)
13+
/// Space Complexity: O(n)
14+
template<typename T>
15+
class MinIndexSegmentTree{
16+
17+
private:
18+
int n;
19+
vector<T> data, tree;
20+
21+
public:
22+
MinIndexSegmentTree(const vector<T>& data): n(data.size()), data(data), tree(4 * n, 0){
23+
buildSegTree(0, 0, n - 1);
24+
}
25+
26+
T query(int index){
27+
assert(0 <= index && index < n);
28+
return data[index];
29+
}
30+
31+
T query(int l, int r){
32+
assert(l <= r);
33+
assert(0 <= l && l < n);
34+
assert(0 <= r && r < n);
35+
return query(0, 0, n - 1, l, r);
36+
}
37+
38+
private:
39+
void buildSegTree(int treeID, int l, int r){
40+
41+
if(l == r){
42+
tree[treeID] = l;
43+
return;
44+
}
45+
46+
int mid = (l + r) / 2;
47+
buildSegTree(treeID * 2 + 1, l, mid);
48+
buildSegTree(treeID * 2 + 2, mid + 1, r);
49+
tree[treeID] = data[tree[treeID * 2 + 1]] < data[tree[treeID * 2 + 2]] ? tree[treeID * 2 + 1] : tree[treeID * 2 + 2];
50+
return;
51+
}
52+
53+
T query(int treeID, int l, int r, int ql, int qr){
54+
55+
if(ql == l && qr == r)
56+
return tree[treeID];
57+
58+
int mid = (l + r) / 2;
59+
if(qr <= mid) return query(treeID * 2 + 1, l, mid, ql, qr);
60+
else if(ql > mid) return query(treeID * 2 + 2, mid + 1, r, ql, qr);
61+
62+
T resl = query(treeID * 2 + 1, l, mid, ql, mid);
63+
T resr = query(treeID * 2 + 2, mid + 1, r, mid + 1, qr);
64+
return data[resl] < data[resr] ? resl : resr;
65+
}
66+
};
67+
68+
class Solution {
69+
70+
private:
71+
MinIndexSegmentTree<int> *seg_tree;
72+
73+
public:
74+
int validSubarraySize(vector<int>& nums, int threshold) {
75+
76+
seg_tree = new MinIndexSegmentTree<int>(nums);
77+
78+
int res = solve(nums, 0, nums.size() - 1, threshold);
79+
return res ? res : -1;
80+
}
81+
82+
int solve(const vector<int>& nums, int l, int r, int threshold){
83+
84+
if(l > r) return 0;
85+
if(l == r){
86+
return nums[l] > threshold ? 1: 0;
87+
}
88+
89+
int min_index = seg_tree->query(l, r);
90+
int min_value = nums[min_index];
91+
92+
if(min_value > threshold / (r - l + 1)) return r - l + 1;
93+
94+
int resl = solve(nums, l, min_index - 1, threshold);
95+
if(resl) return resl;
96+
return solve(nums, min_index + 1, r, threshold);
97+
}
98+
};
99+
100+
101+
int main() {
102+
103+
vector<int> nums1 = {1, 3, 4, 3, 1};
104+
cout << Solution().validSubarraySize(nums1, 6) << '\n';
105+
// 3
106+
107+
vector<int> nums2 = {6,5,6,5,8};
108+
cout << Solution().validSubarraySize(nums2, 7) << '\n';
109+
// 1
110+
111+
return 0;
112+
}

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,6 +2176,7 @@ email: [liuyubobobo@gmail.com](mailto:liuyubobobo@gmail.com)
21762176
| 2327 | [Number of People Aware of a Secret](https://leetcode.com/problems/number-of-people-aware-of-a-secret/) | [] | [C++](2001-2500/2327-Number-of-People-Aware-of-a-Secret/cpp-2327/) | | |
21772177
| 2328 | [Number of Increasing Paths in a Grid](https://leetcode.com/problems/number-of-increasing-paths-in-a-grid/) | [] | [C++](2001-2500/2328-Number-of-Increasing-Paths-in-a-Grid/cpp-2328/) | | |
21782178
| | | | | | |
2179+
| 2334 | [Subarray With Elements Greater Than Varying Threshold](https://leetcode.com/problems/subarray-with-elements-greater-than-varying-threshold/) | [] | [C++](2001-2500/2334-Subarray-With-Elements-Greater-Than-Varying-Threshold/cpp-2334/) | | |
21792180
| 2335 | [Minimum Amount of Time to Fill Cups](https://leetcode.com/problems/minimum-amount-of-time-to-fill-cups/) | [] | [C++](2001-2500/2335-Minimum-Amount-of-Time-to-Fill-Cups/cpp-2335/) | | |
21802181
| 2336 | [Smallest Number in Infinite Set](https://leetcode.com/problems/smallest-number-in-infinite-set/) | [] | [C++](2001-2500/2336-Smallest-Number-in-Infinite-Set/cpp-2336/) | | |
21812182
| 2337 | [Move Pieces to Obtain a String](https://leetcode.com/problems/move-pieces-to-obtain-a-string/) | [] | [C++](2001-2500/2337-Move-Pieces-to-Obtain-a-String/cpp-2337/) | | |

0 commit comments

Comments
 (0)