2016年9月12日 星期一

HackerRank Minimum Distances(Algorithms>Implementation)

題目:
考慮一個陣列A=[a0, a1, ..., an-1]。
當中兩個索引值i, j的距離使用di,j = |i-j|來表示。
給定A,找出最小的di,j,當中ai=aj且i不等於j。
換句話說,找出裡面元素值相等的元素對(pair),
且找到符合這個條件的元素對的最小的距離。
如果沒有任何元素對符合的話,印出-1。

輸入:
第一行輸入A的陣列大小n。
第二行輸入n個以空白隔開的整數,用以代表A的所有元素。

限制:
1<=n<=10的3次方
1<=ai<=10的5次方

輸出:
印出一個整數用以代表A裡面最小的di,j,
如果不存在這樣的數的話,印出-1。

解題:
用簡單的雙層迴圈來解該題,
我們只要沿著每一對都比較過一次,
先確認A[i]是否等於A[j],
再來看新的距離是否小於原本已記錄的最小距離,
是的話就取而代之。
這邊別忘記一開始設定d=-1,
故如果找到第一個距離的話,
必須直接將d覆寫過去。

Code:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main(){
    int n; 
    scanf("%d",&n);
    int *A = malloc(sizeof(int) * n);
    for(int i = 0; i < n; i++){
       scanf("%d",&A[i]);
    }
    int d = -1;
    for(int i = 0; i < n-1; i++)
        for(int j = i + 1; j < n; j++){
            if(A[i] == A[j])
                if(d < 0) d = j - i;
                else if(j - i < d) d = j - i;
        }
    printf("%d", d);
    
    return 0;
}

沒有留言:

張貼留言