Open 1nfo opened 7 years ago
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode ret = new ListNode(0), curr=head, prev=ret;
ret.next = head;
while(curr!=null&&curr.next!=null){
while(curr.next!=null&&curr.next.val!=curr.val) {
prev=curr;
curr=curr.next;
}
if(curr.next==null) return ret.next;
while(curr.next!=null&&curr.next.val==curr.val) curr=curr.next;
prev.next=curr.next;
curr = curr.next;
}
return ret.next;
}
}
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return head;
ListNode ret = new ListNode(head.val-1), prev = ret, curr = head;
ret.next = head;
while(curr!=null){
while(curr!=null&&curr.val!=prev.val){
prev = curr;
curr = curr.next;
}
if(curr==null) break;
while(curr!=null&&prev.val==curr.val) curr = curr.next;
prev.next = curr;
}
return ret.next;
}
}
public class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int max = 0;
stack.push(-1);
for(int i=0;i<=heights.length;i++){
int h = i==heights.length?0:heights[i];
while(stack.peek()>-1&&heights[stack.peek()]>h){
max = Math.max(heights[stack.pop()]*(i-stack.peek()-1),max);
}
if(i>heights.length-2||heights[i]!=heights[i+1]) stack.push(i);
}
return max;
}
}
using array as stack
public class Solution {
public int largestRectangleArea(int[] heights) {
int[] stack = new int[heights.length+2];
int max = 0, p = -1;
stack[++p] = -1;
for(int i=0;i<=heights.length;i++){
int h = i==heights.length?0:heights[i];
while(p>0&&heights[stack[p]]>h){
max = Math.max(heights[stack[p--]]*(i-stack[p]-1),max);
}
if(i>heights.length-2||heights[i]!=heights[i+1]) stack[++p]=i;
}
return max;
}
}