題目描述:
輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字S私植,在數(shù)組中查找兩個(gè)數(shù),是的他們的和正好是S,輸出任意一對(duì)即可
輸入:
每個(gè)測(cè)試案例包括兩行:
第一個(gè)參數(shù)包含n個(gè)整數(shù)數(shù)組嘴脾,每個(gè)數(shù)組均為NSNumber類(lèi)型。數(shù)組的長(zhǎng)度限制在 1M 以?xún)?nèi)蔬墩。
第二個(gè)參數(shù)包含一個(gè)整數(shù)value译打,value表示兩數(shù)之和。
輸出:
對(duì)應(yīng)每個(gè)測(cè)試案例拇颅,輸出兩個(gè)數(shù)扶平,小的先輸出。如果找不到蔬蕊,則輸出“-1 -1”
思想:
類(lèi)似快速排序结澄,將兩邊不合理的值去掉,然后查找中間的岸夯,先查找右邊麻献,再查找左邊
代碼:
+ (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];//取出數(shù)組最右側(cè)的值
NSInteger tempRightValue = tempRightNumber.integerValue;
while (tempRightValue > value) {//待比較值與最右側(cè)值做比較,一直找到比待比較值小的數(shù),這樣會(huì)比較節(jié)約時(shí)間
--right;
tempRightNumber = array[right];
tempRightValue = tempRightNumber.integerValue;
}
NSNumber *tempLeftNumber = array[left];
NSInteger tempLeftValue = tempLeftNumber.integerValue;
while (tempLeftValue + tempRightValue < value) {//去掉最小的不可能用到的數(shù)據(jù)
++left;
tempLeftNumber = array[left];
tempLeftValue = tempLeftNumber.integerValue;
}
while (left < right) {
if (tempLeftValue + tempRightValue == value) {//如果想等自然最好猜扮,打印兩個(gè)值
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