@Gene : Are you sure, when you pop element from stack it will not be next
smaller element to remaining elements in the array(Input)?? I think this is
not gonna work...

On Wed, Nov 23, 2011 at 7:04 PM, Gene <gene.ress...@gmail.com> wrote:

Sorry I forgot to initialize p. It's fixed below.
>>>
>>> On Nov 23, 6:59 am, Gene <gene.ress...@gmail.com> wrote:
>>> > Thanks. Maybe I'm not reading correctly, but tech coder's algorithm
>>> > doesn't mention anything about pairs, which are necessary to obtain
>>> > O(n).  This is what I meant by "almost."
>>> >
>>> > In reverse order, you don't need the pairs. Its simpler.
>>> >
>>> > In a subroutine like yours,
>>> >
>>> > void find_smaller_to_right(int *a, int n)
>>> > {
>>> >   int i, in, p=0, stk[n]; // C99 var length array
>>> >   for (i = n - 1; i >= 0; i--) {
>>> >     in = a[i];
>>> >     while (p > 0 && stk[p - 1] >= in) p--;  // pop
>>> >     a[i] = (p > 0) ? stk[p - 1] : 0;
>>> >     stk[p++] = in;  // push
>>> >   }
>>> >
>>> > }
>>> >
>>> > On Nov 23, 5:13 am, Ankur Garg <ankurga...@gmail.com> wrote:
>>> >
>>> >
>>> >
>>> > > Solution given by tech coder is fine and is working .. I coded it
>>> and its
>>> > > working perfectly using stack
>>> >
>>> > > On Wed, Nov 23, 2011 at 2:50 PM, Gene <gene.ress...@gmail.com>
>>> wrote:
>>> > > > It's a nice problem, and this solution is almost right.
>>> >
>>> > > > Process the input in _reverse_ order, which means we'll also
>>> generate
>>> > > > output in reverse order.
>>> >
>>> > > > The invariant is that the stack is a sorted list - highest value on
>>> > > > top - of the strictly descending subsequence of elements seen so
>>> far
>>> > > > in reverse.
>>> >
>>> > > > So when we get a new input, we want to search backward through the
>>> > > > stack to find the first smaller element. This is handy however,
>>> > > > because the new input also means that when we search past an
>>> element,
>>> > > > it's too big to maintain the invariant, so it must be popped!  We
>>> can
>>> > > > both find the output value and update the stack at the same time:
>>> >
>>> > > > stack = empty
>>> > > > for next input I in _reverse order_
>>> > > >  while stack not empty and top of stack is >= I
>>> > > >    pop and throw away top of stack
>>> > > >  if stack is empty, output is zero
>>> > > >  else output top of stack
>>> > > >  push I
>>> > > > end
>>> >
>>> > > > Since each item is pushed and popped no more than once, this is
>>> O(n).
>>> >
>>> > > > Here's your example:
>>> >
>>> > > > #include <stdio.h>
>>> >
>>> > > > int main(void)
>>> > > > {
>>> > > >  int in[] = { 1, 5, 7, 6, 3, 16, 29, 2, 7 };
>>> > > >  int n = sizeof in / sizeof *in - 1;
>>> > > >  int out[100], stk[100], p = 0, i;
>>> >
>>> > > >  for (i = n - 1; i >= 0; i--) {
>>> > > >    while (p && stk[p - 1] >= in[i]) p--;
>>> > > >    out[i] = (p > 0) ? stk[p - 1] : 0;
>>> > > >    stk[p++] = in[i];
>>> > > >  }
>>> > > >  for (i = 0; i < n; i++) printf(" %d", out[i]);
>>> > > >  printf("\n");
>>> > > >  return 0;
>>> > > > }
>>> >
>>> > > > On Nov 22, 2:20 pm, Aamir Khan <ak4u2...@gmail.com> wrote:
>>> > > > > On Tue, Nov 22, 2011 at 11:50 PM, tech coder <
>>> techcoderonw...@gmail.com
>>> > > > >wrote:
>>> >
>>> > > > > > here is an O(n) approach  using  a stack.
>>> >
>>> > > > > > problem can be stated as " find the 1st smaller element on the
>>> right.
>>> >
>>> > > > > > put the first element in stack.
>>> > > > > > take next element suppose "num"  if this number is less than
>>> elements
>>> > > > > >  stored in stack, pop those elements , for these pooped
>>> elements  num
>>> > > > will
>>> > > > > > be the required number.
>>> > > > > > put the the element (num)   in stack.
>>> >
>>> > > > > > repeat this.
>>> >
>>> > > > > > at last the elements which are in next , they will have 0
>>> (valaue)
>>> >
>>> > > > > > @techcoder : If the numbers are not in sorted order, What
>>> benefit the
>>> >
>>> > > > > stack would provide ? So, are you storing the numbers in sorted
>>> order
>>> > > > > inside the stack ?
>>> >
>>> > > > > I can think of this solution :
>>> >
>>> > > > > Maintain a stack in which the elements will be stored in sorted
>>> order.
>>> > > > Get
>>> > > > > a new element from array and lets call this number as m. Push m
>>> into the
>>> > > > > stack. Now, find all elements which are <= (m-1) using binary
>>> search. Pop
>>> > > > > out all these elements and assign the value m in the output
>>> array.
>>> > > > Elements
>>> > > > > remaining at the end will have the value 0.
>>> >
>>> > > > > I am not sure about the complexity of this algorithm...
>>> >
>>> > > > > > On Wed, Nov 23, 2011 at 12:02 AM, Anup Ghatage <
>>> ghat...@gmail.com>
>>> > > > wrote:
>>> >
>>> > > > > >> I can't think of a better than O(n^2) solution for this..
>>> > > > > >> Any one got anything better?
>>> >
>>> > > > > >> On Tue, Nov 22, 2011 at 8:23 PM, Ankuj Gupta <
>>> ankuj2...@gmail.com>
>>> > > > wrote:
>>> >
>>> > > > > >>> Input: A unsorted array of size n.
>>> > > > > >>> Output: An array of size n.
>>> >
>>> > > > > >>> Relationship:
>>> >
>>> > > > > >>> > elements of input array and output array have 1:1
>>> correspondence.
>>> > > > > >>> > output[i] is equal to the input[j] (j>i) which is smaller
>>> than
>>> > > > > >>> input[i] and jth is nearest to ith ( i.e. first element
>>> which is
>>> > > > smaller).
>>> > > > > >>> > If no such element exists for Input[i] then output[i]=0.
>>> >
>>> > > > > >>> Eg.
>>> > > > > >>> Input: 1 5 7 6 3 16 29 2 7
>>> > > > > >>> Output: 0 3 6 3 2 2 2 0 0
>>> >
>>> > > > > >>> --
>>> > > > > >>> You received this message because you are subscribed to the
>>> Google
>>> > > > > >>> Groups "Algorithm Geeks" group.
>>> > > > > >>> To post to this group, send email to
>>> algogeeks@googlegroups.com.
>>> > > > > >>> To unsubscribe from this group, send email to
>>> > > > > >>> algogeeks+unsubscr...@googlegroups.com.
>>> > > > > >>> For more options, visit this group at
>>> > > > > >>>http://groups.google.com/group/algogeeks?hl=en.
>>> >
>>> > > > > >> --
>>> > > > > >> Anup Ghatage
>>> >
>>> > > > > >>  --
>>> > > > > >> You received this message because you are subscribed to the
>>> Google
>>> > > > Groups
>>> > > > > >> "Algorithm Geeks" group.
>>> > > > > >> To post to this group, send email to
>>> algogeeks@googlegroups.com.
>>> > > > > >> To unsubscribe from this group, send email to
>>> > > > > >> algogeeks+unsubscr...@googlegroups.com.
>>> > > > > >> For more options, visit this group at
>>> > > > > >>http://groups.google.com/group/algogeeks?hl=en.
>>> >
>>> > > > > > --
>>> > > > > > *
>>> >
>>> > > > > >  Regards*
>>> > > > > > *"The Coder"*
>>> >
>>> > > > > > *"Life is a Game. The more u play, the more u win, the more u
>>> win , the
>>> > > > > > more successfully u play"*
>>> >
>>> > > > > >  --
>>> > > > > > You received this message because you are subscribed to the
>>> Google
>>> > > > Groups
>>> > > > > > "Algorithm Geeks" group.
>>> > > > > > To post to this group, send email to
>>> algogeeks@googlegroups.com.
>>> > > > > > To unsubscribe from this group, send email to
>>> > > > > > algogeeks+unsubscr...@googlegroups.com.
>>> > > > > > For more options, visit this group at
>>> > > > > >http://groups.google.com/group/algogeeks?hl=en.
>>> >
>>> > > > > --
>>> > > > > Aamir Khan | 3rd Year  | Computer Science & Engineering | IIT
>>> Roorkee
>>> >
>>> > > > --
>>> > > > You received this message because you are subscribed to the Google
>>> Groups
>>> > > > "Algorithm Geeks" group.
>>> > > > To post to this group, send email to algogeeks@googlegroups.com.
>>> > > > To unsubscribe from this group, send email to
>>> > > > algogeeks+unsubscr...@googlegroups.com.
>>> > > > For more options, visit this group at
>>> > > >http://groups.google.com/group/algogeeks?hl=en.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Algorithm Geeks" group.
>>> To post to this group, send email to algogeeks@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> algogeeks+unsubscr...@googlegroups.com.
>>> For more options, visit this group at
>>> http://groups.google.com/group/algogeeks?hl=en.
>>>
>>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "Algorithm Geeks" group.
>> To post to this group, send email to algogeeks@googlegroups.com.
>> To unsubscribe from this group, send email to
>> algogeeks+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/algogeeks?hl=en.
>>
>
>
>
> --
> Nitin Garg
>
> "Personality can open doors, but only Character can keep them open"
>
> --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To post to this group, send email to algogeeks@googlegroups.com.
> To unsubscribe from this group, send email to
> algogeeks+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/algogeeks?hl=en.
>



-- 
Thanks and Regards,
Sumit Mahamuni.

-- Slow code that scales better can be faster than fast code that doesn't
scale!
-- Tough times never lasts, but tough people do.
-- I love deadlines. I like the whooshing sound they make as they fly by. -
D. Adams

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to