LeetCode刷题之HOT100之搜索旋转排序数组

2024-06-02 20:12

本文主要是介绍LeetCode刷题之HOT100之搜索旋转排序数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024/6/2 雨一直下,一个上午都在床上趴着看完了《百年孤独》,撑伞去吃了个饭,又回到了宿舍。打开许久未开的老电脑,准备做题了。《百年孤独》讲了什么,想表达什么,想给读者留下什么,我不知道,看着知乎对它的解读,我都不太满意。有人总认为这些文学作品是为了留下什么,有什么寓意,其实我觉得故事就是故事,不一定非得要一个大团圆乌托邦的寓意来指点道路,或许每个人都难以跳出百年轮回的孤独中,有时候毁灭也代表了永恒。那么,接下来开始做题吧。

1、题目描述

在这里插入图片描述

2、逻辑分析

题目的意思很清晰,数组本来是有序的,经过旋转后被分成了两个部分,但是被分成的两个部分都是有序的,所以一样可以使用二分查找的思想来解决该题。
如题所示:将本来有序的数组[0,1,2,4,5,6,7]旋转后变成了[4,5,6,7,0,1,2]。我们可以看出[4,5,6,7]和[0,1,2]都是有序的,那么我们可以运用二分查找思想来找到目标值target,下面是具体的算法思路。

在这里插入图片描述

3、代码演示

public int search(int[] nums, int target) {int n = nums.length;// 如果数组为空,返回-1表示未找到 if(n == 0){return -1;}// 如果数组只有一个元素,检查是否与目标值相等if(n == 1){return nums[0] == target?0:-1;}// 初始化左右指针 int l = 0, r = n - 1;while(l <= r){int mid = (l + (r - l) / 2;// 如果中间元素是目标值,返回其索引if(nums[mid] == target){return mid;}// 检查左半部分是否有序if(nums[0] <= nums[mid]){// 如果左半部分有序,检查目标值是否在这个范围内if(nums[0] <= 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;       }}}// 如果循环结束仍未找到目标值,返回-1return -1;}

时间复杂度:O(logn),空间复杂度:O(1)。
好啦,外面大雨不止,今天就不去实验室啦,这样也非常惬意嘿嘿,再见啦!

这篇关于LeetCode刷题之HOT100之搜索旋转排序数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024973

相关文章

计算绕原点旋转某角度后的点的坐标

问题: A点(x, y)按顺时针旋转 theta 角度后点的坐标为A1点(x1,y1)  ,求x1 y1坐标用(x,y)和 theta 来表示 方法一: 设 OA 向量和x轴的角度为 alpha , 那么顺时针转过 theta后 ,OA1 向量和x轴的角度为 (alpha - theta) 。 使用圆的参数方程来表示点坐标。A的坐标可以表示为: \[\left\{ {\begin{ar

KLayout ------ 旋转物体90度并做平移

KLayout ------ 旋转创建的物体 正文 正文 前段时间,有个小伙伴留言问我,KLayout 中如何旋转自己创建的物体,这里特来说明一下。 import pyapoly = pya.DPolygon([pya.DPoint(0, 0), pya.DPoint(0, 5), pya

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

LeetCode--214 最短回文串

题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 示例 1:输入: "aacecaaa"输出: "aaacecaaa"示例 2:输入: "abcd"输出: "dcbabcd" 思路: 我们需要添加多少个字符与给定字符串的前缀子串回文的长度有关. 也就是说去掉其前缀的回文子串,我们只需要补充剩下的子串的逆序

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);