文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

算法leetcode|81. 搜索旋转排序数组 II(rust重拳出击)

2023-09-21 08:49

关注

文章目录


81. 搜索旋转排序数组 II:

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false

你必须尽可能减少整个操作步骤。

样例 1:

输入:nums = [2,5,6,0,0,1,2], target = 0输出:true

样例 2:

输入:nums = [2,5,6,0,0,1,2], target = 3输出:false

提示:

进阶:


分析:


题解:

rust:

impl Solution {    pub fn search(nums: Vec<i32>, target: i32) -> bool {        let n = nums.len();        if n == 0 {            return false;        }        if n == 1 {            return nums[0] == target;        }        let (mut l, mut r) = (0, n - 1);        while l <= r {            let mid = (l + r) >> 1;            if nums[mid] == target {                return true;            }            if nums[l] == nums[mid] && nums[mid] == nums[r] {                if r == 0 {                    // 防止r溢出到非常大                    return false;                }                l += 1;                r -= 1;            } else if nums[l] <= nums[mid] {                if nums[l] <= target && target < nums[mid] {                    r = mid - 1;                } else {                    l = mid + 1;                }            } else {                if nums[mid] < target && target <= nums[n - 1] {                    l = mid + 1;                } else {                    r = mid - 1;                }            }        }        return false;    }}

go:

func search(nums []int, target int) bool {    n := len(nums)if n == 0 {return false}if n == 1 {return nums[0] == target}l, r := 0, n-1for l <= r {mid := (l + r) >> 1if nums[mid] == target {return true}if nums[l] == nums[mid] && nums[mid] == nums[r] {l++r--} else if nums[l] <= nums[mid] {if nums[l] <= target && target < nums[mid] {r = mid - 1} else {l = mid + 1}} else {if nums[mid] < target && target <= nums[n-1] {l = mid + 1} else {r = mid - 1}}}return false}

c++:

class Solution {public:    bool search(vector<int>& nums, int target) {        const int n = nums.size();        if (n == 0) {            return false;        }        if (n == 1) {            return nums[0] == target;        }        int l = 0, r = n - 1;        while (l <= r) {            int mid = (l + r) >> 1;            if (nums[mid] == target) {                return true;            }            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {                ++l;                --r;            } else if (nums[l] <= nums[mid]) {                if (nums[l] <= target && target < nums[mid]) {                    r = mid - 1;                } else {                    l = mid + 1;                }            } else {                if (nums[mid] < target && target <= nums[n - 1]) {                    l = mid + 1;                } else {                    r = mid - 1;                }            }        }        return false;    }};

python:

class Solution:    def search(self, nums: List[int], target: int) -> bool:        if not nums:            return False        n = len(nums)        if n == 1:            return nums[0] == target        l, r = 0, n - 1        while l <= r:            mid = (l + r) >> 1            if nums[mid] == target:                return True            if nums[l] == nums[mid] and nums[mid] == nums[r]:                l += 1                r -= 1            elif nums[l] <= nums[mid]:                if nums[l] <= target < nums[mid]:                    r = mid - 1                else:                    l = mid + 1            else:                if nums[mid] < target <= nums[n - 1]:                    l = mid + 1                else:                    r = mid - 1        return False

java:

class Solution {    public boolean search(int[] nums, int target) {        final int n = nums.length;        if (n == 0) {            return false;        }        if (n == 1) {            return nums[0] == target;        }        int l = 0, r = n - 1;        while (l <= r) {            int mid = (l + r) / 2;            if (nums[mid] == target) {                return true;            }            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {                ++l;                --r;            } else if (nums[l] <= nums[mid]) {                if (nums[l] <= target && target < nums[mid]) {                    r = mid - 1;                } else {                    l = mid + 1;                }            } else {                if (nums[mid] < target && target <= nums[n - 1]) {                    l = mid + 1;                } else {                    r = mid - 1;                }            }        }        return false;    }}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


来源地址:https://blog.csdn.net/leyi520/article/details/132888132

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯