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

news2024/10/6 0:16:10

文章目录

  • 81. 搜索旋转排序数组 II:
    • 样例 1:
    • 样例 2:
    • 提示:
    • 进阶:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


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

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 如果没有旋转,那肯定使用二分查找,二分查找可以在每一次循环遍历都排除一半的数据,效率非常高。
  • 要使用二分查找,数组必须是有序的,但是数组已经被旋转了,所以并不是完全有序,但也并不是完全没有办法。
  • 一般的二分是每次比较中间元素,然后判断元素是否相等,如果不相等再看元素应该在左半部分,还是右半部分,由此排除一半的元素,再继续在另一部分中重复这样的逻辑。
  • 我们可以使用变形的二分查找,可以想到,有序数组旋转后,从中分成两部分,一定有一部分是有序的,而另一部分也是部分有序,但是头一定不小于尾,所以我们可以先判断哪一部分有序,然后再看目标数字是否在有序那部分当中,来决定改变左边界,还是右边界,这样便可以达到二分查找的效率。
  • 由于数组中允许重复元素,那么在某一次查找时,可能会出现中间元素和头尾元素都是相同的情况,这时候就没办法判断哪半部分是有序的,也就不能直接排除一半的元素,但是我们可以将头和尾的元素排除掉。

题解:

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-1
	for l <= r {
		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
}

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/ 博客原创~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读取txt文件中的字符串内容并转换成tensor

import os import torch import numpy as np import json# 初始化数据集 dataset ""# 遍历文件夹下的所有文件 folder_path H:/学习资料/代码/python/jupyterlab_project/pytorch/log/ for file_name in os.listdir(folder_path):file_path os.path.join(folder_p…

【计算机网络】网络入门基础

文章目录 1. 网络发展历史2. 认识协议OSI七层协议 3. TCP/IP协议网络与操作系统 4. 数据传输流程4.1 数据包的封装和分用4.2 同一局域网两台主机的通信4.3 跨一个路由器的两个局域网的通信 5. 网络中的地址管理IP地址MAC地址 1. 网络发展历史 &#x1f4a8;计算机网络的发展历…

C/C++数1的个数 2019年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C数1的个数 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C数1的个数 2019年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定一个十进制正整数n&#xff0c;写下…

奇点云:企业级数据基础设施的设计思路是“操作系统”

「数据场景复杂多变&#xff0c;只能不断推倒重构&#xff1f;」 近日&#xff0c;在《数据云场景指南》线上发布会&#xff0c;“数据云操作系统”同期亮相。奇点云合伙人、CTO地雷谈到&#xff0c;企业级数据基础设施应采用“操作系统”的设计&#xff0c;来帮助企业应对多云…

uniapp 模糊搜索(小白必看)

实现模糊搜索很简单,按照下面的步骤: 1. 搜索栏 <view class"search-box"><uni-search-bar class"uni-mt-10" radius"100" placeholder"请输入移交信息" clearButton"auto" bgColor"#F8F8F8"cancelBut…

安卓核心板开发板的操作系统版本有哪些?

安卓核心板也就是安卓主板平台&#xff0c;一般是指芯片主板硬件平台以及系统开发平台的总称。采用ARM应用处理器平台运行google的android智能化操作系统&#xff0c;是将核心功能封装的一块电子主板&#xff0c;集成芯片、存储器和功放器件等&#xff0c;并提供标准接口的芯片…

【天罡传】李星云终成袁天罡?何为不良帅?特立独行的帅气之道

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 随着《画江湖之天罡传》的即将上映&#xff0c;越来越多的小伙伴们开始对这位神秘人物袁天罡产生了浓厚的兴趣。他是剧中一个极具权谋和智谋的角色&#xff0c;也是李星云一直试图摆脱的影子。在这篇文章中&am…

【实例分割】论文详解YOLACT:Real-time Instance Segmentation

&#x1f3c6;论文下载&#xff1a;paper &#x1f3c6;代码下载&#xff1a;code 目录 &#x1f3c6;论文下载&#xff1a;paper &#x1f3c6;代码下载&#xff1a;code 1.&#x1f337;&#x1f337;创新点 2.&#x1f337;&#x1f337;网络结构 2.1&#x1f340;&am…

【数据结构——顺序表】线性表很难嘛?这篇文章能让你轻松掌握顺序表

线性表 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但是在物理结构上并不一定是连续的&#xff0c;线性表在物理上存储时&#xff0c;通…

创建一个简单的外卖订餐系统

在今天的快节奏生活中&#xff0c;外卖订餐系统已经成为了人们日常生活中不可或缺的一部分。这些系统通过在线点餐和配送服务&#xff0c;为用户提供了便捷的用餐体验。在本文中&#xff0c;我们将创建一个简单的外卖订餐系统&#xff0c;使用Python和Flask框架构建后端&#x…

浅析安防监控系统/AI视频智能分析算法:河道水文水位超标算法应用

传统的水位水尺刻度尺位监测中&#xff0c;所采用的人工读数方式&#xff0c;效率较为低下且 人工成本较高&#xff0c;不利于作业流程的数字化。尽管感应器检测会自动对水位的模拟输入进行筛选&#xff0c;但是由于成本、使用场景要求高、后续日常维护复杂等多种因素&#xff…

电脑文件找回怎么做?文件恢复,就用这3招!

“着急&#xff01;大家伙有什么比较简单的电脑文件找回方法吗&#xff1f;我对电脑不太熟悉&#xff0c;在操作的时候有些文件不知道是被删除了还是丢失了&#xff0c;现在非常需要找回这些丢失的文件&#xff01;” 其实&#xff0c;在使用电脑的过程中&#xff0c;很多电脑用…

学Python的漫画漫步进阶 -- 第十二步

学Python的漫画漫步进阶 -- 第十二步 十二、文件读写12.1 打开文件12.2 关闭文件12.2.1 在finally代码块中关闭文件12.2.2 在with as代码块中关闭文件 12.3 读写文本文件12.4 动动手——复制文本文件12.5 读写二进制文件12.6 动动手——复制二进制文件12.7 练一练12.8 文件读写…

万物目标识别——Detic使用图像级别的监督信号来进行目标检测模型推理(C++/Python)

一、目标识别 1.1 传统目标识别算法 传统目标检测通常将分类&#xff08;确定物体属于哪个类别&#xff09;和定位&#xff08;确定物体的位置&#xff0c;通常使用边界框bbox表示&#xff09;任务耦合在一起。这要求训练数据集中包含每个物体的类别标签以及其对应的bbox位置…

【Proteus仿真】【STM32单片机】智能手环

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;OLED显示温度、心率、加速度极其阈值&#xff1b; 可按下K3键进入阈值设置模式&#xff0c;K1和K2调节对应阈值&#xff0c;K4确定&#xff1b;当检测体温、心率、加速度超出阈值范…

通讯协议介绍CoAP 协议解析

目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…

网店怎么进行有效推广?可以试试软文推广

商家在为自己的网店制定推广方案时&#xff0c;不管是从渠道、手段、客户群体哪个方面出发都会面临挑战。传统推广方式成本过高&#xff0c;而宣传效果不一定明显&#xff0c;我们可以试试利用软文推广&#xff0c;成本较低而且推广效果明显。接下来媒介盒子就告诉大家&#xf…

四川玖璨电子商务有限公司:短视频运营理解

短视频运营是一种通过策划、执行和管理短视频内容以达到品牌目标的一项工作。在如今面临信息爆炸的时代&#xff0c;短视频已经成为了吸引用户注意力的一种重要方式。作为一种新兴媒体形式&#xff0c;短视频拥有跨时空、生动有趣、内容丰富的特点&#xff0c;因此得到了越来越…

智能遥测终端机RTU的好处介绍

智能遥测终端机RTU是一种具有高度智能化复合功能的遥测装置&#xff0c;它通过数据采集、通信传输和自动控制等技术&#xff0c;实现对被监测系统的远程监控、数据分析、故障诊断和远程控制。它在工业自动化领域的广泛应用&#xff0c;给自动化程度的提高、成本的下降和生产效率…

Linux 内存泄漏检测的基本原理

一、mtrace分析内存泄露 mtrace&#xff08;memory trace&#xff09;&#xff0c;是 GNU Glibc 自带的内存问题检测工具&#xff0c;它可以用来协助定位内存泄露问题。 它的实现源码在glibc源码的malloc目录下&#xff0c;其基本设计原理为设计一个函数 void mtrace ()&…