題目
給定一個循環(huán)數(shù)組(最后一個元素的下一個元素是數(shù)組的第一個元素),輸出每個元素的下一個更大元素。數(shù)字 x 的下一個更大的元素是按數(shù)組遍歷順序,這個數(shù)字之后的第一個比它更大的數(shù),這意味著你應該循環(huán)地搜索它的下一個更大的數(shù)。如果不存在,則輸出 -1。
示例 1:
輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數(shù)是 2;
數(shù)字 2 找不到下一個更大的數(shù);
第二個 1 的下一個最大的數(shù)需要循環(huán)搜索,結果也是 2。
注意: 輸入數(shù)組的長度不會超過 10000。
題解
題解一:
- 使用雙重循環(huán)
- 第二層循環(huán)從j = 1開始,每次?。╥+j)%nums[nums.Length]
- 時間復雜度為O(n2),空間復雜度為O(n)
- 代碼
public int[] NextGreaterElements(int[] nums) {
int len = nums.Length;
int[] res = new int[len];
for (int i = 0; i < len; i++)
{
res[i] = -1;
for (int j = 1; j < len; j++)
{
if (nums[(j+i) % len] > nums[i])
{
res[i] = nums[(j+i) % len];
Console.WriteLine(res[i]);
break;
}
}
}
return res;
}
題解二:
- 使用單調棧
- 假設存在一個[1,2,1,1,2,1]改造數(shù)組,這樣一次循環(huán)的數(shù)組
- 維持一個Stack記錄元素的index,Stack中的index對應的元素單調遞減,
- 從改造數(shù)組的最后一個元素向前掃描
- while當前元素比Stack的頂部元素大or Stack為空:
Stack.Pop
Stack為空?當前元素的結果是-1:Stack.Peek - 時間復雜度O(n),空間復雜度O(n)
- 代碼
public int[] NextGreaterElements(int[] nums) {
int len = nums.Length;
int[] res = new int[len];
Stack<int> stack = new Stack<int>();
for (int i = len*2-1; i >= 0; --i)
{
while (stack.Count>0&& nums[stack.Peek()]<=nums[i%len])
{
stack.Pop();
}
res[i % len] = stack.Count > 0 ? nums[stack.Peek()] : -1;
stack.Push(i % len );
}
return res;
}