问题描述:
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
原问题链接:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
问题分析
这个问题在之前的一篇文章里有过讨论。对于循环位移之后的排序数组来说,它相当于形成了两段递增的数组。我们还是可以用二分查找的方法去查找元素的。只是查找的过程稍微有点不一样。我们每次去中间值mid的时候,它可能落在前面的一个递增段上,也可能落在后面的一个递增段上。如果落在前面的话,则满足nums[l] < nums[mid],这个时候需要判断target和nums[mid]的关系,如果它在nums[l]和nums[mid]之间,则将搜索范围缩小到l, mid这里。所以需要将r = mid - 1。否则如果不是这种情况的话,则它肯定在mid + 1, r这个范围。那么就设置 l = mid + 1。
如果mid落在后面那个递增段呢,也类似,判断nums[l] > nums[mid]。这个时候就看target是否在mid + 1和r之间,是的话l = mid + 1,否则 r = mid - 1。
还有一种情况就是因为问题里提到的有相同的元素,这个时候我们就需要将l向mid的方向移动一位,来逐步逼近缩小搜索范围。
详细的代码实现如下:
public class Solution { public boolean search(int[] nums, int target) { int l = 0, r = nums.length - 1; while(l <= r) { int mid = (l + r) / 2; if(nums[mid] == target) return true; if(nums[l] < nums[mid]) { if(target >= nums[l] && target <= nums[mid]) r = mid - 1; else l = mid + 1; } else if(nums[l] > nums[mid]) { if(target >= nums[mid] && target <= nums[r]) l = mid + 1; else r = mid - 1; } else l++; } return false; } }
这个问题的时间复杂度也就是标准二分搜索的时间复杂度,为O(logN)。
相关推荐
在LeetCode的题库中,编号为0081的题目名为“Search in Rotated Sorted Array II”,这是一道中等难度的算法题。题目描述的是在一个经过旋转排序的数组中搜索特定的元素,这个问题与传统的二分查找问题有一定的相似...
leetcode 分类 :person_running::person_running::person_running: 算法 :person_running::person_running::person_running: 实践&理论 :books: :ear: :television: Binary Search(二分查找) easy 69: 278: 35: ...
python python_leetcode题解之081_Search_in_Rotated_Sorted_Array_II
leetcode LeetCode 这个库用于总结leetcode中遇到的习题 常用数据结构习题总结 1.线性表 解决进度 No. Describition mark 1 Remove Duplicates from Sorted Array 2 Remove Duplicates from Sorted Array II 3 ...
leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...
leetcode 1004 leetcode E:简单,M:中等,H:困难 数组和字符串 217. Contains Duplicate (E) 48. Rotate Image (M) -> 2 73. Set Matrix Zeroes (M) 1. Two Sum (E) 167. Two Sum II - Input array is sorted (E)...
leetcode Coding-Interview A repo for popular coding interview problems mainly from Leetcode. 二分搜索/有序数组旋转 Find Minimum In Rotated Sorted Array Find Minimum In Rotated Sorted Array II Search ...
这种问题在LeetCode上被称为“Find Minimum in Rotated Sorted Array II”,是数组、二分查找以及算法复杂度分析等计算机科学基础知识点的具体应用。掌握此类问题的解决方法,对于提高编程能力和算法思维都大有裨益...
【js-leetcode题解之33-search-in-rotated-sorted-array.js知识点】 1. 题目分析:题目"search-in-rotated-sorted-array"要求在旋转排序数组中搜索一个指定的目标值。数组原本是升序排列的,但是经过旋转后,其排序...
今天我们要讨论的是一个在LeetCode平台上非常热门的算法题目——在旋转排序数组中搜索目标值,对应的C语言解法源文件为"33-search-in-rotated-sorted-array.c"。 首先,这个题目的背景是在一个原本有序的数组,经过...
《LeetCode题解之81-在旋转排序数组中搜索二.js》的知识点详细解析如下: 1. **数组旋转概念解析**: 在数组中应用旋转操作,即选择一个旋转点,将数组分割成两部分,然后将后半部分移动到数组的前面。例如,[4,5,...
- Search in Rotated Sorted Array II(在旋转排序数组中搜索II) - Find Minimum in Rotated Sorted Array(在旋转排序数组中寻找最小值) - Find Minimum in Rotated Sorted Array II(在旋转排序数组中寻找...
leetcode切割分组 leetcode 加减乘除运算 ...033_search_in_rotated_sorted_array.py # 旋转排序的数列中查找 034_find_first_and_last_position_of_element_in_sorted_array.py # 查找第一次出现和
in Rotated Sorted Array II/Solution.java) 2014/10/20 难的 [Java](./src/在旋转排序数组中查找最小值/Solution.java) 2014/10/15 中等的 [Java](./src/最大乘积子阵列/Solution.java) 2014/9/23 中等的 [Java](./...
- 二分查找是解决查找问题的利器,如“搜索旋转排序数组”(Search in Rotated Sorted Array)。C++的`std::lower_bound`和`std::upper_bound`函数可以简化这类问题的实现。 3. **递归与动态规划** - 递归是解决...
在JavaScript中,解决LeetCode第154题“寻找旋转排序数组中的最小值 II”是一个经典的算法问题。此题要求在O(logn)时间复杂度内找到一个经过旋转的排序数组中的最小值。由于数组可能有重复元素,并且可以包含重复的...
Search in Rotated Sorted Array(搜索旋转排序数组)#数组 2020/12/08 19. Remove Nth Node From End of List(删除链表的倒数第N个节点) 153. Find Minimum in Rotated Sorted Array(寻找旋转排序数组中的最小值...
在解决leetcode上第153题“寻找旋转排序数组中的最小值”时,一个高效的算法是使用二分查找。这道题目的难点在于输入数组是经过旋转的排序数组,即部分元素被移到了数组的末尾,但它仍然保持了部分排序特性。这类...
在JavaScript中解决LeetCode题号为153的“寻找旋转排序数组中的最小值”问题,要求对一个按照升序排列的数组进行旋转后的数组寻找其中的最小值。这个问题可以通过二分查找算法来高效解决。具体来讲,算法的核心在于...