Lesson 13: MinAbsSumTwo
https://codility.com/programmers/lessons/13
まず配列を昇順にソートします。この時点で最大値が0か負だったり最小値が0か正だった場合は、答えはもうでていますね。
そうでなければ2つのカーソルをつかって配列をチェックしていきましょう。左から右へとすすむものと、右から左へと進むものの 、それぞれlとrと名付けましょう。
もし、lの位置の値がまだ負で絶対値が右のもののより大きければ、lを左へ、逆に右の絶対値が大きければrを左へ、同じならば両方を動かしましょう。
もしlの位置の値が0以上に なったらば、そこで探索をやめることができます。
以下のコードで100%のスコアになります。
#include <alloca.h>
#include <memory.h>
#include <math.h>
int compare_int(const void *a, const void *b)
{
   //don't do 'return *(int*)a - *(int*)b;',
   //as it can cause underflow or overflow.
   if (*(int*)a == *(int*)b){
       return 0;
   }
   if (*(int*)a < *(int*)b){
       return -1;
   }
   
   return 1;
}
int solution(int A[], int N) 
{
    //first we sort in the ascending order
    qsort(A, N, sizeof(int), compare_int);
    
    int l = 0;
    int r = N - 1;
    
    //the initial value for the min
    int min = abs(A[0] + A[0]);
    
    while(l <= r){
                
        int lval = abs(A[l] * 2);
        int rval = abs(A[r] * 2);
        int both = abs(A[l] + A[r]);
        
        //update the min value
        if (lval < min){
            min = lval;
        }
        if (rval < min){
            min = rval;
        }
        if (both < min){
            min = both;
        }
        
        //we A[l] >=0, we have the smallest number already.
        if (A[l] >= 0){
            break;    
        }
        //move the positions.
        if (lval < rval){
            r--;
        }
        else if (lval > rval){
            l++;
        }
        else {
            r--;
            l++;
        }
        
    }
    
    return min;
}

0 件のコメント:
コメントを投稿