From 4c885bcb0aca1410c782ce08ce868c6d51b8f0fe Mon Sep 17 00:00:00 2001 From: Michael Xu Date: Thu, 12 Oct 2023 16:16:37 -0400 Subject: [PATCH] feat: add rust solution to lc problem: No.1095 --- .../1095.Find in Mountain Array/README.md | 52 +++++++++++++++++++ .../1095.Find in Mountain Array/README_EN.md | 52 +++++++++++++++++++ .../1095.Find in Mountain Array/Solution.rs | 47 +++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 solution/1000-1099/1095.Find in Mountain Array/Solution.rs diff --git a/solution/1000-1099/1095.Find in Mountain Array/README.md b/solution/1000-1099/1095.Find in Mountain Array/README.md index f531cdfa5657d..88a5822e42473 100644 --- a/solution/1000-1099/1095.Find in Mountain Array/README.md +++ b/solution/1000-1099/1095.Find in Mountain Array/README.md @@ -213,6 +213,58 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn find_in_mountain_array(target: i32, mountain_arr: &MountainArray) -> i32 { + let n = mountain_arr.length(); + + // First find the maximum element in the array + let mut l = 0; + let mut r = n - 1; + + while l < r { + let mid = (l + r) >> 1; + if mountain_arr.get(mid) > mountain_arr.get(mid + 1) { + r = mid; + } else { + l = mid + 1; + } + } + + let left = Self::binary_search(mountain_arr, 0, l, 1, target); + + if left == -1 { + Self::binary_search(mountain_arr, l, n - 1, -1, target) + } else { + left + } + } + + #[allow(dead_code)] + fn binary_search(m: &MountainArray, mut l: i32, mut r: i32, k: i32, target: i32) -> i32 { + let n = m.length(); + + while l < r { + let mid = (l + r) >> 1; + if k * m.get(mid) >= k * target { + r = mid; + } else { + l = mid + 1; + } + } + + if m.get(l) == target { + l + } else { + -1 + } + } +} +``` + ### **Go** ```go diff --git a/solution/1000-1099/1095.Find in Mountain Array/README_EN.md b/solution/1000-1099/1095.Find in Mountain Array/README_EN.md index c4c78e4764044..932a5b6472b88 100644 --- a/solution/1000-1099/1095.Find in Mountain Array/README_EN.md +++ b/solution/1000-1099/1095.Find in Mountain Array/README_EN.md @@ -183,6 +183,58 @@ public: }; ``` +### **Rust** + +```rust +impl Solution { + #[allow(dead_code)] + pub fn find_in_mountain_array(target: i32, mountain_arr: &MountainArray) -> i32 { + let n = mountain_arr.length(); + + // First find the maximum element in the array + let mut l = 0; + let mut r = n - 1; + + while l < r { + let mid = (l + r) >> 1; + if mountain_arr.get(mid) > mountain_arr.get(mid + 1) { + r = mid; + } else { + l = mid + 1; + } + } + + let left = Self::binary_search(mountain_arr, 0, l, 1, target); + + if left == -1 { + Self::binary_search(mountain_arr, l, n - 1, -1, target) + } else { + left + } + } + + #[allow(dead_code)] + fn binary_search(m: &MountainArray, mut l: i32, mut r: i32, k: i32, target: i32) -> i32 { + let n = m.length(); + + while l < r { + let mid = (l + r) >> 1; + if k * m.get(mid) >= k * target { + r = mid; + } else { + l = mid + 1; + } + } + + if m.get(l) == target { + l + } else { + -1 + } + } +} +``` + ### **Go** ```go diff --git a/solution/1000-1099/1095.Find in Mountain Array/Solution.rs b/solution/1000-1099/1095.Find in Mountain Array/Solution.rs new file mode 100644 index 0000000000000..a1ad7cc1aa55d --- /dev/null +++ b/solution/1000-1099/1095.Find in Mountain Array/Solution.rs @@ -0,0 +1,47 @@ +impl Solution { + #[allow(dead_code)] + pub fn find_in_mountain_array(target: i32, mountain_arr: &MountainArray) -> i32 { + let n = mountain_arr.length(); + + // First find the maximum element in the array + let mut l = 0; + let mut r = n - 1; + + while l < r { + let mid = (l + r) >> 1; + if mountain_arr.get(mid) > mountain_arr.get(mid + 1) { + r = mid; + } else { + l = mid + 1; + } + } + + let left = Self::binary_search(mountain_arr, 0, l, 1, target); + + if left == -1 { + Self::binary_search(mountain_arr, l, n - 1, -1, target) + } else { + left + } + } + + #[allow(dead_code)] + fn binary_search(m: &MountainArray, mut l: i32, mut r: i32, k: i32, target: i32) -> i32 { + let n = m.length(); + + while l < r { + let mid = (l + r) >> 1; + if k * m.get(mid) >= k * target { + r = mid; + } else { + l = mid + 1; + } + } + + if m.get(l) == target { + l + } else { + -1 + } + } +} \ No newline at end of file