假设我有一个整数的整数int [],我想搜索最接近的较小值到某个输入数。
例如,如果数组包含1
,23
,57
,59
,120
且输入为109
,则输出应该是59
。
我已经尝试了这个但是根本不需要它。
NSTimeInterval currentTime = self.player.currentTime;
NSInteger playerTime=currentTime;
NSUInteger index = [_timesArray indexOfObject:@(playerTime)
inSortedRange:NSMakeRange(0, _timesArray.count-1)
options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
usingComparator:^(id a, id b) {
return [a compare:b];
}];
答案 0 :(得分:2)
您的代码可以按照您提供的示例数据按预期工作:
NSArray *_timesArray = @[@1, @23, @57, @59, @120];
NSTimeInterval currentTime = 109;
NSInteger playerTime=currentTime;
NSUInteger index = [_timesArray indexOfObject:@(playerTime)
inSortedRange:NSMakeRange(0, _timesArray.count-1)
options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
usingComparator:^(id a, id b) {
return [a compare:b];
}];
NSLog(@"Index: %lu", (unsigned long)index);
输出:
Index: 4
检查您的输入。可能他们不是你认为的那样。
答案 1 :(得分:1)
正如我之前所说的那样:“你已经对阵列进行了排序,你需要的是从最大数量到最小数量......这里的算法很简单!”
NSNumber* givenNumber = @(105);
for (NSNumber* item in [@[@(1), @(23), @(57), @(59), @(120)] reverseObjectEnumerator]){
// go downward
if (item.integerValue < givenNumber.integerValue)
{
NSLog(@"%@ < %@",item,givenNumber);
// save this number somewhere
break;
}
}
答案 2 :(得分:0)
它可以通过在O(lg n)中运行的binary_search_like算法来解决,但我不知道objective-c所以我将用c ++给出代码。
我假设给定的元素不在数组中。
int binary_search_like(int s[], int key, int low, int high)
{
int middle;
if (low > high) return (s[high]);
middle = (low + high) / 2;
if (s[middle] > key)
return(binary_search_like(s, key, low, middle - 1));
else
return(binary_search_like(s, key, middle + 1, high));
}
int Search(int s[], int key, int size){
if (key > s[size - 1]) return s[size - 1];
// Check if key < smallest element , give error !
return binary_search_like(s, key, 0, size);
}