Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number.
Example 1:
Input: [1,2,1]
Output: [2,-1,2]
Explanation: The first 1's next greater number is 2;
The number 2 can't find next greater number;
The second 1's next greater number needs to search circularly, which is also 2.
Note: The length of given array won't exceed 10000.
第一种思路暴力搜索。
在实现第一种方式时我们使用了下面的一种方式循环遍历数组:
for (int j = i+1; j != i; ++j) {
if (j >= nums_len) j = j % nums_len;
if (curr_num < nums[j]) {
ans[i] = nums[j];
break;
}
}
但是当i=0的时候会出问题,因为j永远无法为0。
最后暴力搜索的实现如下:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
if (nums.size() == 0) return vector<int>();
int nums_len = static_cast<int>(nums.size());
vector<int> ans(nums_len, -1);
for(int i = 0; i < nums_len; ++i) {
int curr_num = nums[i];
int count = 1;
while (count < nums_len) {
int idx = (i+count) % nums_len;
if (curr_num < nums[idx]) {
ans[i] = nums[idx];
break;
}
++count;
}
}
return ans;
}
};
第二种思路是使用栈来纪录数组的下标,然后依次寻找符合条件的数。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
if (nums.size() == 0) return vector<int>();
int nums_len = static_cast<int>(nums.size());
vector<int> next_nums(nums_len, -1);
stack<int> index_stored;
for (int i = 0; i < 2*nums_len; ++i) {
int num = nums[i%nums_len];
while (!index_stored.empty() && nums[index_stored.top()] < num) {
next_nums[index_stored.top()] = num;
index_stored.pop();
}
if(i < nums_len) index_stored.push(i);
}
return next_nums;
}
};