[LeetCode] Search in Rotated Sorted Array II
来源:互联网 发布:mac卸载软件 编辑:程序博客网 时间:2024/06/06 06:37
题目
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
假设一个以升序排列的数组在预先知道的枢轴上旋转。
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Write a function to determine if a given target is in the array. The array may contain duplicates.
编写一个函数来确定给定的目标是否在数组中。数组可能包含重复项。
分析
其实这就是一个循环有序数组,循环有序数组就是将一个有序数组切成两段,并交换位置。
主要思路还是利用二分查找,但由于循环的原因,划分数组时会出现不同情况,因此要做进一步的判断。
- 当目标元素 = 中间元素时,直接返回中间元素索引。
- 当中间元素 < 起始元素时,从中间元素到结束元素是有序的。此时可以判断目标元素是否在有序部分中。
若目标元素在有序部分中,在其中进行二分查找。否则在循环部分中进行查找。 - 当中间元素 > 起始元素时,从起始元素到中间元素时有序的。此时可以判断目标元素是否在有序部分中。
若目标元素在有序部分中,在其中进行二分查找。否则在循环部分中进行查找。 - 当中间元素 = 起始元素时,无法判断在哪半边查找,只能移动一位,直至遇到其他情况。
注:由于本题是判断目标元素的位置,和在循环有序数组找最小值可以直接认定循环又有序部分的起始元素就是最小值不同,需要一步步二分查找,故循环条件是起始元素 ≤ 结束元素,而不是起始元素小于结束元素即可。
代码
#include <iostream>#include <vector>using namespace std;class Solution {public: bool search(vector<int>& nums, int target) { int start = 0, end = nums.size() - 1; while (start <= end) { int mid = (start + end) / 2; if (target == nums[mid]) { return true; } if (nums[mid] < nums[start]) { if (target > nums[mid] && target <= nums[end]) { start = mid + 1; } else { end = mid - 1; } } else if (nums[mid] > nums[start]) { if (target >= nums[start] && target < nums[mid]) { end = mid - 1; } else { start = mid + 1; } } else { start++; } } return false; }};int main() { int num[] = {4, 4, 4, 4, 4, 0, 1, 2, 3}; int target = 2; int length = sizeof(num) / sizeof(int); vector<int> nums(num, num + length); Solution solution; bool exist = solution.search(nums, target); cout << "In the array, whether the target exists:" << exist << endl;}
参考博客
CSDN 博客:http://blog.csdn.net/linhuanmars/article/details/20588511
阅读全文
0 0
- LeetCode: Search in Rotated Sorted Array II
- LeetCode Search in Rotated Sorted Array II
- LeetCode : Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II
- [Leetcode] Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- [LeetCode]Search in Rotated Sorted Array II
- [leetcode] Search in Rotated Sorted Array II
- LeetCode-Search in Rotated Sorted Array II
- LeetCode - Search in Rotated Sorted Array II
- 【Leetcode】Search in Rotated Sorted Array II
- Leetcode: Search in Rotated Sorted Array II
- 【leetcode】Search in Rotated Sorted Array II
- leetcode Search in Rotated Sorted Array II
- Leetcode: Search in Rotated Sorted Array II
- [LeetCode] Search in Rotated Sorted Array II
- LeetCode | Search in Rotated Sorted Array II
- LeetCode Search in Rotated Sorted Array II
- 字符串与字节数组 字符数组的转换
- ViewPager+Fragment实现3D立方体滑动效果
- 洛谷上的2道简单的01背包问题
- Freemark学习(三):流程控制语句&list&map获
- java转换字符串的编码
- [LeetCode] Search in Rotated Sorted Array II
- .mat文件后缀名消失
- CSS布局奇淫巧计之-强大的负边距
- 使用枚举实现单例模式
- HDU
- SuperSale UVA
- [USACO16OPEN]Closing the Farm_Silver(联通分量+逆向边处理+并查集)
- Android PatternMatcher
- iOS开发中静态库的制作