From 6b6228f712186a0badb070527f227c3abcda0004 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Mon, 1 Jan 2024 12:26:43 +0800 Subject: [PATCH] 20240101 Finished --- src/solution/mod.rs | 1 + .../s0004_median_of_two_sorted_arrays.rs | 90 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/solution/s0004_median_of_two_sorted_arrays.rs diff --git a/src/solution/mod.rs b/src/solution/mod.rs index 4bc0247..27280b2 100644 --- a/src/solution/mod.rs +++ b/src/solution/mod.rs @@ -11,3 +11,4 @@ mod s0912_sort_an_array; mod s1276_number_of_burgers_with_no_waste_of_ingredients; mod s0006_zigzag_conversion; mod s0007_reverse_integer; +mod s0004_median_of_two_sorted_arrays; diff --git a/src/solution/s0004_median_of_two_sorted_arrays.rs b/src/solution/s0004_median_of_two_sorted_arrays.rs new file mode 100644 index 0000000..1ab4d9f --- /dev/null +++ b/src/solution/s0004_median_of_two_sorted_arrays.rs @@ -0,0 +1,90 @@ +/** + * [4] Median of Two Sorted Arrays + * + * Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. + * The overall run time complexity should be O(log (m+n)). + * + * Example 1: + * + * Input: nums1 = [1,3], nums2 = [2] + * Output: 2.00000 + * Explanation: merged array = [1,2,3] and median is 2. + * + * Example 2: + * + * Input: nums1 = [1,2], nums2 = [3,4] + * Output: 2.50000 + * Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5. + * + * + * Constraints: + * + * nums1.length == m + * nums2.length == n + * 0 <= m <= 1000 + * 0 <= n <= 1000 + * 1 <= m + n <= 2000 + * -10^6 <= nums1[i], nums2[i] <= 10^6 + * + */ +pub struct Solution {} + +// problem: https://leetcode.cn/problems/median-of-two-sorted-arrays/ +// discuss: https://leetcode.cn/problems/median-of-two-sorted-arrays/discuss/?currentPage=1&orderBy=most_votes&query= + +// submission codes start here + +use std::cmp::min; + +impl Solution { + pub fn find_median_sorted_arrays(nums1: Vec, nums2: Vec) -> f64 { + let len1 = nums1.len() as i32; + let len2 = nums2.len() as i32; + let left = (len1 + len2 + 1) / 2 ; + let right = (len1 + len2 + 2) / 2; + + (Solution::get_k_th(&nums1, 0, len1 - 1, &nums2, 0, len2 - 1, left) as f64 + + Solution::get_k_th(&nums1, 0, len1 - 1, &nums2, 0, len2 - 1, right) as f64) * 0.5 + } + + fn get_k_th(nums1: &Vec, start1: i32, end1: i32, + nums2: &Vec, start2: i32, end2: i32, k: i32) -> i32 { + let len1 = end1 + 1 - start1; + let len2 = end2 + 1 - start2; + + if len1 > len2 { + return Solution::get_k_th(nums2, start2, end2, nums1, start1, end1, k); + } + + if len1 == 0 { + return nums2[(start2 + k - 1) as usize]; + } + + if k == 1 { + return min(nums1[start1 as usize], nums2[start2 as usize]); + } + + let i = start1 + min(len1, k / 2) - 1; + let j = start2 + min(len2, k / 2) - 1; + + return if nums1[i as usize] > nums2[j as usize] { + Solution::get_k_th(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1)) + } else { + Solution::get_k_th(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1)) + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_4() { + assert_eq!(2.0, Solution::find_median_sorted_arrays(vec![1, 3], vec![2])); + assert_eq!(2.5, Solution::find_median_sorted_arrays(vec![1, 2], vec![3, 4])); + assert_eq!(2.0, Solution::find_median_sorted_arrays(vec![2], vec![])); + } +}