二分查找

This commit is contained in:
游由 2021-07-20 22:14:56 +08:00
parent 23b2f3cd2b
commit 466c6e1702
4 changed files with 149 additions and 32 deletions

View File

@ -64,5 +64,7 @@ mod q0392;
mod q0045;
mod q0912;
mod q0918;
mod q0704;
mod q0035;
mod q0152;
mod q0977;

View File

@ -0,0 +1,82 @@
use crate::Solution;
impl Solution {
/// 35.搜索插入位置
///
/// [原题链接](https://leetcode-cn.com/problems/search-insert-position/)
///
/// 2021-07-19 14:42:33
///
/// 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
///
/// 请必须使用时间复杂度为 `O(log n)` 的算法。
///
/// + 示例 1:
/// - 输入: `nums = [1,3,5,6], target = 5`
/// - 输出: `2`
/// + 示例 2:
/// - 输入: `nums = [1,3,5,6], target = 2`
/// - 输出: `1`
/// + 示例 3:
/// - 输入: `nums = [1,3,5,6], target = 7`
/// - 输出: `4`
/// + 示例 4:
/// - 输入: `nums = [1,3,5,6], target = 0`
/// - 输出: `0`
/// + 示例 5:
/// - 输入: `nums = [1], target = 0`
/// - 输出: `0`
/// + 提示:
/// - `1 <= nums.length <= 104`
/// - `-104 <= nums[i] <= 104`
/// - `nums` 为无重复元素的升序排列数组
/// - `-104 <= target <= 104`
///
/// Related Topics 数组 二分查找
///
/// 👍 969 👎 0
///
/// # 方法1 线性搜索
/// ```rust
/// pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
/// if nums.is_empty() {
/// return 0;
/// }
/// for i in 0..nums.len() {
/// if target <= nums[i] {
/// return i as i32;
/// }
/// }
/// nums.len() as i32
/// }
/// ```
/// # 方法2 二分查找
pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
let mut l: i32 = 0;
let mut r: i32 = nums.len() as i32 - 1;
while l <= r {
let mut m = (l + (r - l) / 2);
if target <= nums[m as usize] {
r = m - 1;
} else {
l = m + 1;
}
}
return l;
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q0035() {
let nums = vec![1, 3, 5, 6];
let target = 5;
let ans = Solution::search_insert(nums, target);
assert_eq!(ans, 2);
}
}

View File

@ -0,0 +1,65 @@
use crate::Solution;
impl Solution {
/// 704.二分查找
///
/// [原题链接](https://leetcode-cn.com/problems/binary-search/)
///
/// 2021-07-19 14:15:29
///
/// 给定一个 `n` 个元素有序的(升序)整型数组 `nums` 和一个目标值 `target` ,写一个函数搜索 `nums` 中的 `target`,如果目标值存在返回下标,否则返回 `-1`。
///
/// + 示例 1:
/// - 输入: `nums = [-1,0,3,5,9,12], target = 9`
/// - 输出: `4`
/// - 解释: `9` 出现在 `nums` 中并且下标为 `4`
/// + 示例 2:
/// - 输入: `nums = [-1,0,3,5,9,12], target = 2`
/// - 输出: `-1`
/// - 解释: `2` 不存在 `nums` 中因此返回 `-1`
/// + 提示:
/// - 你可以假设 `nums` 中的所有元素是不重复的。
/// - `n` 将在 `[1, 10000]`之间。
/// - `nums` 的每个元素都将在 `[-9999, 9999]`之间。
///
/// Related Topics 数组 二分查找
///
/// 👍 276 👎 0
pub fn search1(nums: Vec<i32>, target: i32) -> i32 {
/*match nums.binary_search(&target) {
Ok(n) => n as i32,
_ => -1
}*/
let mut l: i32 = 0;
let mut r: i32 = nums.len() as i32 - 1;
while l <= r {
let mut m = (l + (r - l) / 2);
if nums[m as usize] == target {
return m;
} else if target <= nums[m as usize] {
r = m - 1;
} else {
l = m + 1;
}
}
if (l as usize) < nums.len() && nums[l as usize] == target {
l
} else {
-1
}
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q0704() {
let nums = vec![-1, 0, 3, 5, 9, 12];
let ans = Solution::search1(nums, 9);
assert_eq!(ans, 4);
}
}

View File

@ -2264,38 +2264,6 @@ impl Solution {
Vec::<i32>::new()
}
/// 35.搜索插入位置
///
/// [原题链接](https://leetcode-cn.com/problems/search-insert-position/)
/// # 方法1 线性搜索
/// ```rust
/// pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
/// if nums.is_empty() {
/// return 0;
/// }
/// for i in 0..nums.len() {
/// if target <= nums[i] {
/// return i as i32;
/// }
/// }
/// nums.len() as i32
/// }
/// ```
/// # 方法2 二分查找
pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
let mut l: i32 = 0;
let mut r: i32 = nums.len() as i32 - 1;
while l <= r {
let mut m = (l + (r - l) / 2);
if target <= nums[m as usize] {
r = m - 1;
} else {
l = m + 1;
}
}
return l;
}
/// 58.最后一个单词的长度
///
/// [原题链接](https://leetcode-cn.com/problems/length-of-last-word/)