‎We can go by binary search approach like first consider the largest number as 
it is an obvious  sol^n then consider max/2 n so on running time O(log(max)) .

Sent from my BlackBerry 10 smartphone.
  Original Message  
From: atul anand
Sent: Wednesday 26 March 2014 12:20 PM
To: [email protected]
Reply To: [email protected]
Subject: Re: [algogeeks] Re: strictly sorting by adding or subtracting a range 
of numbers

@bhargav : could you please explain your algorithmn

On 3/25/14, bhargav krishna yb <[email protected]> wrote:
> Even i completed it :). It was from one of the coding challenges...
>
> public class Hill {
>
> /**
> * @param args
> */
> public static void main(String[] args) {
> // TODO Auto-generated method stub
> Integer[] l = new Integer[] {15,5, 4, 3, 2, 8};
> hill(l);
> }
> public static void hill(Integer[] l) {
> int max = 0;
> for(int i=0;i<l.length;i++) {
> if(max<l[i]) {
> max = l[i];
> }
> }
> int min =0 ;
> while(true) {
> int av = (max+min)/2;
> if(min==max) {
> if(isHill(l, av)) {
> System.out.println(min);
> }
> else {
> System.out.println("broke");
> }
> break;
> }
> if(isHill(l, av)) {
> max = av;
> }
> else {
> min= av+1;
> }
> }
> }
> public static Boolean isHill(Integer[] l, int i) {
> int prev = -1;
> for(int j=0;j<l.length;j++) {
> int max = Math.max(prev+1, l[j]-i);
> if(Math.abs(max-l[j])>i) {
> return false;
> }
> prev = max;
> }
> return true;
> }
> }
>
> On Tue, Mar 25, 2014 at 10:14 AM, Dan <[email protected]> wrote:
>>
>>
>> I just stumbled upon this one (I know, a little late). At least this
>> way...
>> it's too late to be helpful if it was a Homework assignent. :-)
>>
>> This is one of those problems that, at first, appears difficult, but ,
>> upon
>> closer inspection, turns out to have a very straight forward (elegant?)
>> solution.
>>
>> Take any two adjacent values from the list... call them a & b
>>
>> In the worst case scenario, the value of a is higher than the value
>> of
>> b... a > b
>>
>> Therefore, we need an X value that solves the inequality.... a - X
>> <
>> b + X
>>
>> Rearrange this equation just slightly to another equivalent equation...
>> a
>> - b < 2X
>>
>> This indicates that a slightly different (but, still equivalent) problem
>> can
>> be solved to arrive at a correct solution.
>>
>> Only allow values from 0 to 2X, [0,2X] to be added to the original
>> values
>> in the array (ie. no subtractions). This simplifies things greatly and
>> allows for a clear algorithm solution that can be easily performed in a
>> single pass through the array. Essentially, you find a value of 2X that
>> works... then divide that in half, and convert the resulting float type
>> value to a whole integer value to get the final X value that solves the
>> 'original' problem statement.
>>
>> The fortran code below has been tested and appears to work just fine.
>> The real algorithm of note is the function routine: FUNCTION
>> TransformArray( v ).
>> Note that the important code is only 7 simple lines long and should
>> be easy to recode in most any language.
>> It runs extremely fast, even for array sizes of 10000.
>> There's also 'fluff' code here, written to test multiple test sets to
>> check
>> the value of X arrived and to time everything. at is the desired answer.
>>
>> Does anyone know of any Practical applications for this algorithm?? I'm
>> guessing it's just an interesting problem.
>>
>> Dan :-)
>>
>> Module Transform
>>
>> Contains
>>
>> Function TransformArray( v ) Result(x)
>> !---------------------------------------------------
>> ! Find a minium X value to transform the array, v(:)
>> ! Transformed array values can be negative. It is a trivial task to
>> ! alter this to guarantee no negative values in the transformed array.
>> !---------------------------------------------------
>> Integer, intent(in) :: v(:)
>> Integer :: x
>> Integer :: i, b
>> x = 0
>> b = v(1)
>> Do i = 2, Size(v)
>> b = Max( b+1, v(i) )
>> x = Max( x , b-v(i) )
>> End Do
>> x = Ceiling( x/2.0 ) ! smallest integer greater/equal to the
>> value.
>> End Function TransformArray
>>
>>
>> Subroutine Validate_X( v, x )
>> !---------------------------------------------------------------------
>> ! Given a value of x, see if the array can be successfully transformed
>> ! This is merely code to see if the X value arrived at is correct.
>> !---------------------------------------------------------------------
>> Integer, intent(in) :: v(:)
>> Integer, intent(in) :: x
>> Integer, allocatable :: vt(:), xt(:)
>> Integer :: i, n
>>
>> n = Size(v)
>> Allocate( vt(n), xt(n) )
>>
>> vt(1) = v(1) - x
>> xt(1) = -x
>>
>> Do i = 2, n
>> vt(i) = Max( vt(i-1)+1, v(i)-x )
>> xt(i) = vt(i)-v(i)
>> End Do
>>
>> write(*,'(a,29999i6)') ' v = ', v
>> write(*,'(a,29999i6)') ' xt = ', xt
>> write(*,'(a,29999i6)') ' vt = ', vt
>>
>> If( Any( abs(xt) > x ) ) Then
>> write(*,'(a)' ) ' A higher x value was required during the
>> transformation.'
>> write(*,'(a,i0,a)') ' X = ', x, ' does not work.'
>> End If
>>
>> If( Any( vt(1:n-1) >= vt(2:n) ) ) &
>> write(*,'(a)') ' ERROR: Transformed array is not in "Strictly
>> Ascending"
>> order!'
>>
>> End Subroutine Validate_X
>>
>> End Module Transform
>>
>>
>>
>> Program Main
>> !----------------------------------
>> Use Transform
>> Implicit None
>> Integer, parameter :: nmax=10000
>> Integer :: n, x
>> Integer, allocatable :: v(:)
>> Real, allocatable :: r(:)
>> Integer :: it1, it2
>>
>> Allocate( v(nmax), r(nmax) )
>>
>> call timer(it1)
>> write(*,*)
>> write(*,*) 'Test Case #1: array size = 5, Easy to check'
>> n = 5
>> v(1:n) = (/5,4,3,2,8/)
>> Call Solve_for_X()
>> write(*,*) '------------------------------------------'
>>
>> write(*,*)
>> write(*,*) 'Test Case #2 array size = 8, Easy to check'
>> n = 8
>> v(1:n) = (/8,12,7,15,10,20,12,16/)
>> Call Solve_for_X()
>> write(*,*) '------------------------------------'
>>
>> write(*,*)
>> write(*,*) 'Test Case #3: array size = 10000 w/ random array values up
>> to
>> 999'
>> n = 10000
>> Call Random_Seed()
>> Call Random_Number( r(1:n) )
>> v(1:n) = 1 + Int(999*r(1:n))
>> Call Solve_for_X()
>> write(*,*) '------------------------------------'
>>
>> call timer(it2)
>> write(*,*) 'Total time = ', Real(it2-it1)/100.0
>>
>> Contains
>>
>> Subroutine Solve_for_X()
>> !------------------------
>> x = TransformArray( v(1:n) )
>> write(*,'(a,i0)') ' X minimum = ', x
>>
>> Call Validate_X( v(1:n), x )
>>
>> ! Check to see if a smaller X value would have worked
>> write(*,*)
>> write(*,'(a,i0,a)') ' Check to see if x = ', x-1, ' will work:'
>> Call Validate_X( v(1:n), x-1 )
>> End Subroutine Solve_for_X
>>
>> End Program Main
>>
>>
>> Test Case #1: array size = 5, Easy to check
>> X minimum = 3
>> v = 5 4 3 2 8
>> xt = -3 -1 1 3 -2
>> vt = 2 3 4 5 6
>>
>> Check to see if x = 2 will work:
>> v = 5 4 3 2 8
>> xt = -2 0 2 4 -1
>> vt = 3 4 5 6 7
>> A higher x value was required during the transformation.
>> X = 2 does not work.
>> ------------------------------------------
>>
>> Test Case #2 array size = 8, Easy to check
>> X minimum = 5
>> v = 8 12 7 15 10 20 12 16
>> xt = -5 -5 1 -5 1 -5 4 1
>> vt = 3 7 8 10 11 15 16 17
>>
>> Check to see if x = 4 will work:
>> v = 8 12 7 15 10 20 12 16
>> xt = -4 -4 2 -4 2 -4 5 2
>> vt = 4 8 9 11 12 16 17 18
>> A higher x value was required during the transformation.
>> X = 4 does not work.
>> ------------------------------------
>>
>> Test Case #3: array size = 10000 w/ random array values up to 999
>> X minimum = 5466
>> v = 422 430 670 62 37 561 287 : : : 565 664
>> 389
>> 273
>> xt = -5466 -5466 -5466 -4857 -4831 -5354 -5079 : : : 4923 4825
>> 5101
>> 5218
>> vt = -5044 -5036 -4796 -4795 -4794 -4793 -4792 : : : 5488 5489
>> 5490
>> 5491
>>
>> Check to see if x = 5465 will work:
>> v = 422 430 670 62 37 561 287 : : : 565 664
>> 389
>> 273
>> xt = -5465 -5465 -5465 -4856 -4830 -5353 -5078 : : : 4924 4826
>> 5102
>> 5219
>> vt = -5043 -5035 -4795 -4794 -4793 -4792 -4791 : : : 5489 5490
>> 5491
>> 5492
>> A higher x value was required during the transformation.
>> X = 5465 does not work.
>> ------------------------------------
>> Total time = 9.99999978E-03
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "Algorithm Geeks" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/algogeeks/ClXwlon0eXo/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>
>
>
> --
> -bhargav krishna
>
> --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
>

-- 
You received this message because you are subscribed to a topic in the Google 
Groups "Algorithm Geeks" group.
To unsubscribe from this topic, visit 
https://groups.google.com/d/topic/algogeeks/ClXwlon0eXo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to 
[email protected].

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].

Reply via email to