<p>Given a circular integer array <code>nums</code> (i.e., the next element of <code>nums[nums.length - 1]</code> is <code>nums[0]</code>), return <em>the <strong>next greater number</strong> for every element in</em> <code>nums</code>.</p>

<p>The <strong>next greater number</strong> of a number <code>x</code> 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&#39;t exist, return <code>-1</code> for this number.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,1]
<strong>Output:</strong> [2,-1,2]
Explanation: The first 1&#39;s next greater number is 2; 
The number 2 can&#39;t find next greater number. 
The second 1&#39;s next greater number needs to search circularly, which is also 2.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,3,4,3]
<strong>Output:</strong> [2,3,4,-1,4]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>4</sup></code></li>
	<li><code>-10<sup>9</sup> &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, -1);
        stack<int> st; // Stack to store indices

        for(int i = 0; i < 2*n; i++) {
            int num = nums[i % n];
            while(!st.empty() && nums[st.top()] < num){
                ans[st.top()] = num;
                st.pop();
            }
            if(i < n){
                st.push(i);
            }
        }

        return ans;
    }
};



//T.C: O(n2)

// class Solution {
// public:
//     vector<int> nextGreaterElements(vector<int>& nums) {
//         vector<int> ans;
//         for(int i=0;i<nums.size();i++){
//             bool flag = true;
//             for(int j=i+1;j<nums.size();j++){
//                 if(nums[i]<nums[j]){
//                     ans.push_back(nums[j]);
//                     flag = false;
//                     break;
//                 }
//             }
//             if(flag){
//                 for(int k=0;k<i;k++){
//                     if(nums[k]>nums[i]){
//                         ans.push_back(nums[k]);
//                         flag = false;
//                         break;
//                     }
//                 }
//             }
//             if(flag) ans.push_back(-1);
//         }
//         return ans;
//     }
// };
26500