Skip to content

Commit 07e2af9

Browse files
authored
Update find-maximum-non-decreasing-array-length.cpp
1 parent cc55b42 commit 07e2af9

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

C++/find-maximum-non-decreasing-array-length.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,27 @@ class Solution3 {
7171
return dp;
7272
}
7373
};
74+
75+
// Time: O(nlogn)
76+
// Space: O(n)
77+
// dp, greedy, prefix sum, binary search
78+
class Solution4 {
79+
public:
80+
int findMaximumLength(vector<int>& nums) {
81+
vector<int64_t> prefix(size(nums) + 1);
82+
for (int i = 0; i < size(nums); ++i) {
83+
prefix[i + 1] = prefix[i] + nums[i];
84+
}
85+
vector<int64_t> dp(size(nums) + 1, numeric_limits<int>::max());
86+
dp[0] = 0;
87+
vector<int> prev(size(nums) + 1, -1);
88+
for (int right = 0, left = -1; right < size(nums); ++right) {
89+
left = max(left, prev[right]);
90+
dp[right + 1] = dp[left + 1] + 1;
91+
const int next_right = distance(cbegin(prefix), lower_bound(cbegin(prefix), cend(prefix), prefix[right + 1] + (prefix[right + 1] - prefix[left + 1]))) - 1;
92+
prev[next_right] = right;
93+
}
94+
return dp.back();
95+
}
96+
};
97+

0 commit comments

Comments
 (0)