HackerRank | Sorting - Sherlock and Array


質問する


https://www.hackerrank.com/challenges/sherlock-and-array/problem
配列内の要素に対して1つの要素(左のすべての要素の和==右のすべての要素の和)が存在する場合、YESまたはNOが返されます.

質問に答える(1)


for文を使用して、基準とするインデックスの番号を1増やし、基準インデックスの左側の整数と右側の整数をダブルfor文として求め、if文で値が等しいかどうかを比較します.
配列内の要素が1の場合、または左と右が等しい場合は「YES」を返し、そうでない場合はNOを返します.

コード(1)

char* balancedSums(int arr_count, int* arr) {
    if(arr_count == 1) return "YES";
    for(int i=0;i<arr_count;i++)
    {
        int left_sum = 0, right_sum = 0;
        for(int j=0;j<i;j++)
            left_sum += arr[j];
        for(int j=i+1;j<arr_count;j++)
            right_sum += arr[j];
        if(left_sum == right_sum) return "YES";
    }
    return "NO";
}

結果(1)


testcase 3とtestcase 4では、時間が過ぎているので、ドアの問題ではなく別の方法で問題を解決すべきだと思います.

質問に答える(2)


左と右の和を求めないで、まず配列のすべての整数の和を求めて、それから全体の和の中でそのインデックスに対応する要素の値の値を減算して右と右と、対応する要素の値の加算を左と指定して、右と左の和を比較します.

コード(2)

char* balancedSums(int arr_count, int* arr) {
    int right = 0, left = 0;
    for(int i=0; i<arr_count; i++)
        right += arr[i];
    if(arr_count == 1) return "YES";
    for(int i=0; i<arr_count; i++)
    {
        right -= arr[i];
        if(left == right) return "YES";
        left += arr[i];
    }
    return "NO";
}

結果(2)