1.问题描述
    给定一个无序的循环数组(循环数组 即数组的最后一个元素的下一个元素为数组的第一个元素)
    输出 数组每一个元素的 下一个第一个比该元素大的元素 没有则输出-1

    示例:输入 1,2,1
    输出 2,-1,2

    解题思路:
    1.效率不高的方向: 对数组内的每一个元素向后循环遍历 直到循环到自己或者找到比自己大的元素输出

    2.正确思路:
    如果数组中某一段元素单调不递增 如 8,5,5,4,10
    则 比8大的第一个元素10 一定也是 5,5,4 的第一个大的元素 这样 就只需要去找比8 大的元素 就行了 减少循环比较的次数

    3.单调递减栈的应用

    1. 将数组 copy一份放到后面 变成 长度*2的数组 1,2,1——-> 1,2,1,1,2,1 准备结果数组 {-1,-1,-1}
    2. 依次遍历数组 元素为item
    3. 如果栈为空 item 压入栈
    4. 如果栈不为空 依次比较栈顶元素和 当前循环变量的大小 如果栈顶元素小于 当前变量 输出栈顶元素 既栈顶元素的第一个比它大的元素为 item
    5. 依次比较栈顶元素 直到栈为空 或者栈顶元素大于等于 item
    6. item 压入栈

    4.具体代码 c#

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace nextMax
    7. {
    8. class Program
    9. {
    10. struct item
    11. {
    12. public int value;
    13. public int index;
    14. public item(int v,int ide)
    15. {
    16. value = v;
    17. index = ide;
    18. }
    19. }
    20. static void Main(string[] args)
    21. {
    22. int[] p = new int[3] { 1, 2, 1 };
    23. int[] res=NextGreaterElements(p);
    24. for (int i = 0; i < res.Length; i++)
    25. {
    26. Console.WriteLine(res[i]);
    27. }
    28. Console.ReadKey();
    29. }
    30. public static int[] NextGreaterElements(int[] nums)
    31. {
    32. Stack sigle = new Stack();
    33. //定义一个字典 用来存 值的下标 key=nums[i] value=i
    34. Dictionary<int, int> indexDic = new Dictionary<int, int>();
    35. int[] res = new int[nums.Length];
    36. for (int i = 0; i < nums.Length; i++)
    37. {
    38. res[i] = -1;
    39. }
    40. //遍历两遍数组
    41. for (int s = 0; s < nums.Length * 2; s++)
    42. {
    43. int v = s % nums.Length;
    44. int k= nums[v];
    45. if (sigle.Count == 0)
    46. {
    47. sigle.Push(new item(k,v));
    48. }
    49. else
    50. {
    51. //和栈顶元素比较
    52. while (sigle.Count>0 && sigle.Peek().value < k)
    53. {
    54. item y = sigle.Pop();
    55. res[y.index] = k;
    56. }
    57. sigle.Push(new item(k, v));
    58. }
    59. }
    60. return res;
    61. }
    62. }
    63. }