#array #rotate #algorithm

sorted-rotated

在O(logN)时间内找到排序并旋转的列表中的数字

2个版本

0.1.1 2021年7月30日
0.1.0 2021年7月30日

2576 in 算法

MIT许可协议

8KB
95

sorted_rotated

假设你有一个排序后旋转的数字列表,它将在O(logN)时间内找到你搜索的数字。

如果列表没有旋转,或者有重复项,该软件包不会失败。在这种情况下,它将遍历列表两次,导致一些性能下降。但是,如果列表没有排序(升序),它肯定会失败。

该方法很简单:执行二分搜索以找到枢轴,然后缩小二分搜索的范围以找到所需的数字。如果没有枢轴,它将在列表上再次执行二分搜索。

在两种情况下,它都返回一个Option类型,要么是找到的数字的索引,要么是None。因此,你必须显式设置match分支以提取值。

快速入门

fn main() {
    let list: Vec<i32> = vec![5, 6, 1, 2, 3, 4];

    // Or an array can be used as well:
    let list: [i32; 6] = [5, 6, 1, 2, 3, 4];

    let desired: i32 = 2;
    
    let mut element = Elements::new(list, desired);
    
    match element.find_pivot().find_desired().result() {
        Some(idx) => println!("index: {}", idx),
        None => println!("Not found"),
    }
}

无运行时依赖