LeetCode 503 Next Greater Element II
题干:
给定一个环形数组 n u m s nums nums( n u m s [ n u m s . l e n g t h − 1 ] nums[nums.length-1] nums[nums.length−1]就是 n u m s [ 0 ] nums[0] nums[0]),对于其中每一个元素,求它之后比它大的第一个元素是多少。
Input: nums = [2,1,2,4,3]
Output: [4,2,4,-1,4]
解:
还是求下一个更大元素,不同的是数组是环形。
环形数组,常用套路是把数组长度翻倍,把原数组往后复制一份。但其实可以不用额外创建空间,只是把遍历的下标 i i i翻倍了,利用取模运算( i % n i \% n i%n)就可完成循环遍历。
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
stack<int> st;
vector<int> ans(n); //给vector初始化,以便可以直接通过下标访问
for(int i = 2*n - 1; i >= 0; i--){
while(!st.empty() && st.top() <= nums[i%n]){
st.pop();
}
ans[i%n] = st.empty()? -1: st.top();//ans[i%n]覆盖更新,刷新了一遍,保证最后一次是准确答案
st.push(nums[i%n]);
}
return ans;
}
Tips:
-
循环遍历数组:取模( i % n i \% n i%n)
-
vector不能用下标形式添加元素,但是可以用下标形式对元素内容进行修改,即下标 v [ n ] v[n] v[n]是返回 v v v中第 n n n个位置元素的引用。
vector<int> v; v[0]=1; //错误,因为v不包含任何元素 vector<int> v2(10); v2[0]=1; //正确,此时v2是含有10个0的容器