我有关于这个问题的讲座,据我了解,我必须找到这个球会破裂的最低点。我想到使用二分查找来获得 O(logN) 时间复杂度。如果球在索引处破裂并在索引 - 1 处再次破裂,我们只需继续搜索,直到找到它破裂的索引,而左边的索引没有破裂。
function two_crystals(data : boolean[]) : number {
let first_index = 0;
let last_index = data.length - 1;
while(first_index <= last_index){
let mid_index = Math.floor((last_index + first_index) / 2);
if (data[mid_index]) {
// Check if it doesn't break at the previous floor
if (mid_index === 0 || !data[mid_index - 1]) {
return mid_index;
}
// Continue searching in the lower half
last_index = mid_index - 1;
} else {
// Continue searching in the upper half
first_index = mid_index + 1;
}
}
return -1
}
也许我没有正确理解问题,但我认为这个选项更好
问题的关键在于,你无法用破碎的晶体来检查晶体是否破碎。也就是说,晶体只有在不破裂的情况下才可以重复使用。因此,假设第一个晶体在
mid_index
处破裂,现在您用第二个晶体在 mid_index - 1
处检查。假设它再次破裂。现在你没有更多的水晶了,也无法检查其他楼层。因此,这个解决方案不起作用。