首页 > 试题广场 >

在升序数组中查找元素的位置

[编程题]在升序数组中查找元素的位置
  • 热度指数:951 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的非降序排列的整数数组nums,和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]
该题有的解法


示例1

输入

[4,7,7,8,8,10],8

输出

[3,4]

说明

可以在数组中找到整数8,其开始位置为3,结束位置为4     
示例2

输入

[4,7,7,8,8,10],6

输出

[-1,-1]

说明

不可以在数组中找到整数6,故输出整数-1     
struct Solution{

}

use std::cmp::Ordering::{Less, Equal, Greater};
impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param nums int整型一维数组 
        * @param target int整型 
        * @return int整型一维数组
    */
    pub fn searchRange(&self, nums: Vec<i32>, target: i32) -> Vec<i32> {
        // write code here
        vec![
            Self::floor(&nums, [-1, nums.len() as i32 - 1], target),
            Self::ceil(&nums, (-1, nums.len() as i32), target)
            ]
    }

    fn floor(v: &Vec<i32>, [l, r]: [i32; 2], t: i32) -> i32 {
        // (l, r]
        if l >= r {return -1}
        let mid = (l + 1) + (r - l - 1) / 2;
        // if mid < 0 {}
        match t.cmp(&v[mid as usize]) {
            Less => Self::floor(v, [l, mid - 1], t),
            Greater => Self::floor(v, [mid, r], t),
            Equal => {
                let r = Self::floor(v, [l, mid - 1], t);
                if r == -1 {
                    mid
                } else {r}
            }
        }
    }
    fn ceil(v: &Vec<i32>, (l, r): (i32, i32), t: i32) -> i32 {
        // (l, r)
        if r - l < 2 {
            return -1
        }
        let mid = (l + r)/2;
        match v[mid as usize].cmp(&t) {
            Greater => Self::ceil(v, (l, mid), t),
            Less => Self::ceil(v, (mid, r), t),
            Equal => {
                let r= Self::ceil(v, (mid, r), t);
                if r == -1 {mid} else {r}
            }
        }
    }
}

发表于 2023-07-27 09:22:30 回复(0)

问题信息

难度:
1条回答 1147浏览

热门推荐

通过挑战的用户

查看代码