【剣指offer】と定値の2つの数

1630 ワード

タイトルの説明:


1つのインクリメンタルソートの配列と1つの数字Sを入力して、配列の中で2つの数を探して、はい彼らの和はちょうどSで、任意のペアを出力すればいいです

入力:


各テストケースには2つの行があります.最初のパラメータにはn個の整数配列が含まれ、各配列はNSNumberタイプです.配列の長さは1 M以内に制限される.2番目のパラメータには整数valueが含まれ、valueは2つの数の和を表します.

出力:


各テストケースに対応して、2つの数を出力し、小さな先出力を出力します.見つからない場合は「-1-1」を出力します.

アイデア:


クイックソートと同様に、両側の不合理な値を削除し、中央の値を検索し、右を検索してから左のコードを検索します.
+ (BOOL)equalSubWithArray:(NSArray *)array value:(NSInteger )value {
    if (array == nil || array.count == 0) {
        return false;
    }
    NSInteger left = 0;
    NSInteger right = array.count - 1;
    NSNumber *tempRightNumber = array[right];// 
    NSInteger tempRightValue = tempRightNumber.integerValue;
    while (tempRightValue > value) {// , , 
        --right;
        tempRightNumber = array[right];
        tempRightValue = tempRightNumber.integerValue;
    }
    NSNumber *tempLeftNumber = array[left];
    NSInteger tempLeftValue = tempLeftNumber.integerValue;
    while (tempLeftValue + tempRightValue < value) {// 
        ++left;
        tempLeftNumber = array[left];
        tempLeftValue = tempLeftNumber.integerValue;
    }
    while (left < right) {
        if (tempLeftValue + tempRightValue == value) {// , 
            NSLog(@" %zu,  %zu",tempLeftValue, tempRightValue);
            return true;
        } else if (tempLeftValue + tempRightValue > value) {// 
            --right;
        } else {
            ++left;// 
        }
    }
    
    return false;
}

GitHub : https://github.com/XiaoChenYung/ArrowToOffer/blob/master/ArrowToOffer/EqualSum.m