看数据规模,nlogn的方法足够了。
先排个序,再统计每个位置的最少糖果数即可。
struct Node {
int value;
int id;
int candy = 0;
Node(int id, int value) {
this->id = id;
this->value = value;
}
};
bool mySort(Node* a, Node* b) {
return a->value < b->value;
}
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<Node*> arr;
int sum = 0;
for (int i = 0; i < n; i++) {
arr.push_back(new Node(i, ratings[i]));
}
sort(arr.begin(), arr.end(), mySort);
int* idx = new int[n];
for (int i = 0; i < n; i++) {
idx[arr[i]->id] = i;
}
for (int i = 0; i < n; i++) {
if (arr[i]->candy == 0) {
arr[i]->candy = 1;
sum += 1;
}
if (arr[i]->id > 0) {
int left = idx[arr[i]->id - 1];
if (arr[i]->value < arr[left]->value && arr[i]->candy + 1 > arr[left]->candy) {
sum += arr[i]->candy + 1 - arr[left]->candy;
arr[left]->candy = arr[i]->candy + 1;
}
}
if (arr[i]->id < n - 1) {
int right = idx[arr[i]->id + 1];
if (arr[i]->value < arr[right]->value && arr[i]->candy + 1 > arr[right]->candy) {
sum += arr[i]->candy + 1 - arr[right]->candy;
arr[right]->candy = arr[i]->candy + 1;
}
}
}
for (int i = 0; i < n; i++) delete arr[i];
delete [] idx;
return sum;
}
};