链表中的下一个更大节点
题目链接:链表中的下一个更大节点
O(N^2)的一种写法。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
vector<int> ans;
ListNode *p,*q,*r;
p = head;
while(p){
//解决p
q = p->next;
if(!q){
ans.push_back(0);
}else if(q->val > p->val){
ans.push_back(q->val);
}else{
r = q->next;
while(r && r->val <= p->val){ //比较耗费时间
r = r->next;
}
if(r){
ans.push_back(r->val);
}else{
ans.push_back(0);
}
}
p = q;
}
return ans;
}
};
/***
1 5 4 5 9 9
5 9 5 9 0 0
*/
方法二:单调栈解法尝试下
时间复杂度:O(N)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
stack<pair<int,int> > st; //first 下标,second值
ListNode *p,*q,*r;
p = head;
vector<int> ans;
int count = 0;
while(p){
ans.push_back(0); //写进默认值
while(!st.empty() && st.top().second < p->val){ //栈非空 且 当前结点的值比栈顶的值大
pair<int,int> myp = st.top(); //取出栈顶元素,(栈元素记录了 索引 和 值 )
int index = myp.first;
ans[index] = p->val; //修改索引下的值
st.pop(); //出栈操作
}
//代码第一次运行到这里时 直接进栈处理
st.push(make_pair(count++,p->val));
p = p->next;
}
return ans;
}
};
/**
维护一个 单调递减栈,一旦有元素大于栈顶元素的值,那么修改数组中元素的值。
更新(修改)的办法如下:
栈中存放的节点信息
包括了结点的值 和 结点的下标 (自定义的下标,从0开始)
如果有p->val > 栈顶结点的值了,那么依照栈顶结点的下标在数组中进行修改即可。
*/