20250201 finished.
This commit is contained in:
		@@ -462,3 +462,5 @@ mod p119_pascals_triangle_ii;
 | 
			
		||||
mod p350_intersection_of_two_arrays_ii;
 | 
			
		||||
 | 
			
		||||
mod p541_reverse_string_ii;
 | 
			
		||||
 | 
			
		||||
mod p81_search_in_rotated_sorted_array_ii;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								src/problem/p81_search_in_rotated_sorted_array_ii.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/problem/p81_search_in_rotated_sorted_array_ii.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
/**
 | 
			
		||||
 * [81] Search in Rotated Sorted Array II
 | 
			
		||||
 */
 | 
			
		||||
pub struct Solution {}
 | 
			
		||||
 | 
			
		||||
// submission codes start here
 | 
			
		||||
 | 
			
		||||
impl Solution {
 | 
			
		||||
    pub fn search(nums: Vec<i32>, target: i32) -> bool {
 | 
			
		||||
        if nums.len() == 1 {
 | 
			
		||||
            return target == nums[0];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let (mut left, mut right) = (0, nums.len());
 | 
			
		||||
 | 
			
		||||
        // 搜索范围[left, right)
 | 
			
		||||
        while left < right {
 | 
			
		||||
            let middle = (right - left) / 2 + left;
 | 
			
		||||
 | 
			
		||||
            if nums[middle] == target {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if nums[middle] > nums[0] {
 | 
			
		||||
                // 左侧的数组是有序的
 | 
			
		||||
                if target >= nums[0] && target < nums[middle] {
 | 
			
		||||
                    right = Self::get_first_middle(&nums, middle);
 | 
			
		||||
                } else {
 | 
			
		||||
                    left = Self::get_last_middle(&nums, middle) + 1;
 | 
			
		||||
                }
 | 
			
		||||
            } else if nums[middle] == nums[0] {
 | 
			
		||||
                // 有可能nums[middle] == nums[0]
 | 
			
		||||
                let first_middle = Self::get_first_middle(&nums, middle);
 | 
			
		||||
                if first_middle == 0 {
 | 
			
		||||
                    // [0, middle] 都是同一个数
 | 
			
		||||
                    left = Self::get_last_middle(&nums, middle) + 1;
 | 
			
		||||
                } else {
 | 
			
		||||
                    // 反之那么[middle,]都是同一个数
 | 
			
		||||
                    right = first_middle;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                // 右侧数组是有序的
 | 
			
		||||
                if target > nums[middle] && target <= nums[nums.len() - 1] {
 | 
			
		||||
                    left = Self::get_last_middle(&nums, middle) + 1;
 | 
			
		||||
                } else {
 | 
			
		||||
                    right = Self::get_first_middle(&nums, middle);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_first_middle(nums: &Vec<i32>, mut middle: usize) -> usize {
 | 
			
		||||
        while middle > 0 && nums[middle - 1] == nums[middle] {
 | 
			
		||||
            middle -= 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        middle
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_last_middle(nums: &Vec<i32>, mut middle: usize) -> usize {
 | 
			
		||||
        while middle < nums.len() - 1 && nums[middle + 1] == nums[middle] {
 | 
			
		||||
            middle += 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        middle
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// submission codes end
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_81() {
 | 
			
		||||
        assert!(Solution::search(
 | 
			
		||||
            vec![1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 | 
			
		||||
            2
 | 
			
		||||
        ));
 | 
			
		||||
        assert!(Solution::search(
 | 
			
		||||
            vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1],
 | 
			
		||||
            2
 | 
			
		||||
        ));
 | 
			
		||||
        assert!(Solution::search(vec![2, 5, 6, 0, 0, 1, 2], 0));
 | 
			
		||||
        assert!(!Solution::search(vec![2, 5, 6, 0, 0, 1, 2], 3));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user