12模式
给一数组,让你找一对满足i<j && a[i]<a[j]的i和j (O(N)时间复杂度 O(1)空间复杂度)
123模式
给一数组,让你找一对满足i<j<k && a[i]<a[j]<a[k] 的i和j和k (O(N)时间复杂度 O(N)空间复杂度)
思路
题一,就可以直接用双指针遍历,维护从前往后和从后往前的最小值及最大值以及对应的索引。
题二,用map记录从前往后和从后往前的最小值及最大值以及对应的索引。
代码
class Solution {
public:
pair<int, int> find_12(vector<int>& nums) {
int l = 0, r = nums.size()-1;
int min_ = INT_MAX, min_index;
int max_ = INT_MIN, max_index;
while(l < r) {
if (nums[l] < min_) {
min_ = nums[l];
min_index = l++;
}
if (nums[r] > max_) {
max_ = nums[r];
max_index = r--;
}
if (min_ < max_) {
return {min_index, max_index};
}
}
return {-1, -1};
}
vector<int> find123(vector<int>& nums) {
int n = nums.size();
if (n < 3) return {-1};
map<int, pair<int, int>> min_;
map<int, pair<int, int>> max_;
min_[0] = {0, nums[0]}; // index min_
for (int i=1; i<n; ++i) {
pair<int, int> tmp = min_[i-1];
int x = tmp.first;
int y = tmp.second;
if (nums[i] < y) {
x = i;
y = nums[i];
}
min_[i] = {x, y};
}
max_[n-1] = {n-1, nums[n-1]};
for (int i=n-2; i>=0; --i) {
pair<int, int> tmp = max_[i+1];
int x = tmp.first;
int y = tmp.second;
if (nums[i] > y) {
x = i;
y = nums[i];
}
max_[i] = {x, y};
}
for (int i=1; i<n-1; ++i) {
if (min_[i-1].second < nums[i] && nums[i] < max_[i+1].second) {
return {min_[i-1].first, i, max_[i+1].first};
}
}
return {-1};
}
};