二分查找
This commit is contained in:
parent
23b2f3cd2b
commit
466c6e1702
|
@ -64,5 +64,7 @@ mod q0392;
|
|||
mod q0045;
|
||||
mod q0912;
|
||||
mod q0918;
|
||||
mod q0704;
|
||||
mod q0035;
|
||||
mod q0152;
|
||||
mod q0977;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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/)
|
||||
|
|
Loading…
Reference in New Issue