问题描述:
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.
思路:每次选定nums中第i位的元素后,遍历[i+1:]和[:1],最先找到的值返回即可,思路很简单,但是使用python和c++一个AC,一个超时,可见python的运行效率确实不高
一开始是用python写的:
class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
l = len(nums)
r = [-1]*l
for i, num in enumerate(nums):
j = i+1
while(j%l != i):
if nums[(j%l)] > num:
r[i] = nums[(j%l)]
break
j += 1
return r
本地运行结果都是对的,提交就超时,没办法,改用c++,果然AC
c++版本:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int l = nums.size();
if(l==0)
return nums;
vector<int> r(l,-1);
for(int i=0;i<l;i++)
for(int j=i+1;j%l!=i;j++)
if(nums[j%l]>nums[i]){
r[i] = nums[j%l];
break;
}
return r;
}
};
另外附上一个python不超时版本,网上找的,使用的是堆,复杂度O(n)
class Solution(object):
def nextGreaterElements(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
stack = []
size = len(nums)
ans = [-1] * size
for x in range(size * 2):
i = x % size
while stack and nums[stack[-1]] < nums[i]:
ans[stack.pop()] = nums[i]
stack.append(i)
return ans