33. Search in Rotated Sorted Array & 81. Search in Rotated Sorted Array II
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [,,,,,,] might become [,,,,,,]). You are given a target value to search. If found in the array return its index, otherwise return -. You may assume no duplicate exists in the array. Your algorithm's runtime complexity must be in the order of O(log n). Example : Input: nums = [,,,,,,], target =
Output:
Example : Input: nums = [,,,,,,], target =
Output: -
断点函数单调性,无非单增,或者只有两段,且各自区间范围内单增

C
4 ms
int search(int* nums, int numsSize, int target) {
if(numsSize == ) return -;
int left = , right = numsSize -;
int pivot = ; // turning point
int mid = ;
// search for turning point.
while (left < right)
{
mid = left + (right - left) / ;
if(nums[mid] > nums[right])
{
left = mid + ;
}else{
right = mid;
}
}
pivot = left;
// search for target.
left = , right = numsSize-;
while (left <= right)
{
//printf("mid:%d, left:%d, right:%d\n", mid, left, right);
mid = left + (right - left) / ;
int realmid = (mid + pivot)%numsSize;
if(nums[realmid] == target)
{
return realmid;
}else if (nums[realmid] < target) {
left = mid + ;
}else {
right = mid - ;
}
}
return -;
}
C++ 0ms
static int x=[](){
// toggle off cout & cin, instead, use printf & scanf
std::ios::sync_with_stdio(false);
// untie cin & cout
cin.tie(NULL);
return ;
}();
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty()) return -;
function<int()> _find = [&nums]() -> int {
if(nums.empty()) return ;
int low = , high = nums.size() -;
while(low <= high) {
int mid = (high-low)/ + low;
if(nums[mid] > nums[high]) low = mid+;
else if(nums[mid] < nums[high]) high = mid;
else return mid;
}
// return low;
};
function <int(int,int)> binary_search = [&nums](int target, int index) -> int {
if(nums.empty()) return -;
int low =index, high = nums.size() - + index;
while (low <= high) {
int mid = (high-low)/ + low;
int value = nums[mid%nums.size()];
if(target < value) high = mid -;
else if(target > value) low = mid + ;
else
return mid%nums.size();
}
return -;
};
int mid = _find();
return binary_search(target, mid);
}
};
c++ 4ms
/*
Explanation Let's say nums looks like this: [12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] Because it's not fully sorted, we can't do normal binary search. But here comes the trick: If target is let's say 14, then we adjust nums to this, where "inf" means infinity:
[12, 13, 14, 15, 16, 17, 18, 19, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf] If target is let's say 7, then we adjust nums to this:
[-inf, -inf, -inf, -inf, -inf, -inf, -inf, -inf, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] And then we can simply do ordinary binary search. Of course we don't actually adjust the whole array but instead adjust only on the fly only the elements we look at. And the adjustment is done by comparing both the target and the actual element against nums[0]. by StefanPochmann
https://leetcode.com/problems/search-in-rotated-sorted-array/discuss/14443/C++-4-lines-4ms by rantos22
*/
class Solution {
public:
int search(vector<int> &nums, int target)
{
auto skip_left = [&]( int x) { return x >= nums[] ? numeric_limits<int>::min() : x; };
auto skip_right = [&] (int x) { return x < nums[] ? numeric_limits<int>::max() : x; };
auto adjust = [&] (int x) { return target < nums[] ? skip_left(x) : skip_right(x); }; auto it = lower_bound( nums.begin(), nums.end(), target, [&] (int x, int y) { return adjust(x) < adjust(y); } ); return it != nums.end() && *it == target ? it-nums.begin() : -;
}
};
c 4ms
/*
The idea is that when rotating the array, there must be one half of the array that is still in sorted order.
For example, 6 7 1 2 3 4 5, the order is disrupted from the point between 7 and 1. So when doing binary search, we can make a judgement that which part is ordered and whether the target is in that range, if yes, continue the search in that half, if not continue in the other half. -- by flyinghx61
https://leetcode.com/problems/search-in-rotated-sorted-array/discuss/14472/Java-AC-Solution-using-once-binary-search
*/
int search(int* nums, int numsSize, int target) {
int start = ;
int end = numsSize - ;
while (start <= end){
int mid = (start + end) / ;
if (nums[mid] == target)
return mid; if (nums[start] <= nums[mid]){
if (target < nums[mid] && target >= nums[start])
end = mid - ;
else
start = mid + ;
} if (nums[mid] <= nums[end]){
if (target > nums[mid] && target <= nums[end])
start = mid + ;
else
end = mid - ;
}
}
return -;
}
c 4ms 下面的程序只是结果满足测试用例,实际情况凑巧而已。
/*
The idea is that when rotating the array, there must be one half of the array that is still in sorted order.
For example, 6 7 1 2 3 4 5, the order is disrupted from the point between 7 and 1. So when doing binary search, we can make a judgement that which part is ordered and whether the target is in that range, if yes, continue the search in that half, if not continue in the other half. -- by flyinghx61
https://leetcode.com/problems/search-in-rotated-sorted-array/discuss/14472/Java-AC-Solution-using-once-binary-search
*/
int search(int* nums, int numsSize, int target) {
int lo = , hi = numsSize - ;
while (lo <= hi) {
int mid = lo + (hi - lo) / ;
if (target == nums[mid])
return mid;
if (nums[mid] < nums[lo]) {
// 6,7,0,1,2,3,4,5
if (target < nums[mid] || target >= nums[lo])
hi = mid - ;
else
lo = mid + ;
} else {
// 2,3,4,5,6,7,0,1
if (target > nums[mid] || target < nums[lo])
lo = mid + ;
else
hi = mid - ;
}
}
return -;
}
81. Search in Rotated Sorted Array II
. Search in Rotated Sorted Array II
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [,,,,,,] might become [,,,,,,]). You are given a target value to search. If found in the array return true, otherwise return false. Example : Input: nums = [,,,,,,], target =
Output: true
Example : Input: nums = [,,,,,,], target =
Output: false
Follow up: This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
Would this affect the run-time complexity? How and why?
bool search(int* nums, int numsSize, int target) {
int l = , r = numsSize - ;
while (l <= r) {
int m = l + (r - l)/;
if (nums[m] == target) return true; //return m in Senumsrch in Rotnumsted numsrrnumsy I
if (nums[l] < nums[m]) { //left hnumslf is sorted
if (nums[l] <= target && target < nums[m])
r = m - ;
else
l = m + ;
} else if (nums[l] > nums[m]) { //right hnumslf is sorted
if (nums[m] < target && target <= nums[r])
l = m + ;
else
r = m - ;
} else l++;
}
return false;
}
/*
1) everytime check if targe == nums[mid], if so, we find it.
2) otherwise, we check if the first half is in order (i.e. nums[left]<=nums[mid])
and if so, go to step 3), otherwise, the second half is in order, go to step 4)
3) check if target in the range of [left, mid-1] (i.e. nums[left]<=target < nums[mid]), if so, do search in the first half, i.e. right = mid-1; otherwise, search in the second half left = mid+1;
4) check if target in the range of [mid+1, right] (i.e. nums[mid]<target <= nums[right]), if so, do search in the second half, i.e. left = mid+1; otherwise search in the first half right = mid-1; The only difference is that due to the existence of duplicates, we can have nums[left] == nums[mid] and in that case, the first half could be out of order (i.e. NOT in the ascending order, e.g. [3 1 2 3 3 3 3]) and we have to deal this case separately. In that case, it is guaranteed that nums[right] also equals to nums[mid], so what we can do is to check if nums[mid]== nums[left] == nums[right] before the original logic, and if so, we can move left and right both towards the middle by 1. and repeat.
dong.wang.1694
*/
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = , right = nums.size()-, mid; while(left<=right)
{
mid = (left + right) >> ;
if(nums[mid] == target) return true; // the only difference from the first one, trickly case, just updat left and right
if( (nums[left] == nums[mid]) && (nums[right] == nums[mid]) ) {++left; --right;} else if(nums[left] <= nums[mid])
{
if( (nums[left]<=target) && (nums[mid] > target) ) right = mid-;
else left = mid + ;
}
else
{
if((nums[mid] < target) && (nums[right] >= target) ) left = mid+;
else right = mid-;
}
}
return false;
}
};
. Search in Rotated Sorted Array II
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [,,,,,,] might become [,,,,,,]). You are given a target value to search. If found in the array return true, otherwise return false. Example : Input: nums = [,,,,,,], target =
Output: true
Example : Input: nums = [,,,,,,], target =
Output: false
Follow up: This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
Would this affect the run-time complexity? How and why?
6ms
bool search(int* nums, int numsSize, int target) {
int l = , r = numsSize - ;
while (l <= r) {
int m = l + (r - l)/;
if (nums[m] == target) return true; //return m in Senumsrch in Rotnumsted numsrrnumsy I
if (nums[l] < nums[m]) { //left hnumslf is sorted
if (nums[l] <= target && target < nums[m])
r = m - ;
else
l = m + ;
} else if (nums[l] > nums[m]) { //right hnumslf is sorted
if (nums[m] < target && target <= nums[r])
l = m + ;
else
r = m - ;
} else l++;
}
return false;
}
4ms
/*
1) everytime check if targe == nums[mid], if so, we find it.
2) otherwise, we check if the first half is in order (i.e. nums[left]<=nums[mid])
and if so, go to step 3), otherwise, the second half is in order, go to step 4)
3) check if target in the range of [left, mid-1] (i.e. nums[left]<=target < nums[mid]), if so, do search in the first half, i.e. right = mid-1; otherwise, search in the second half left = mid+1;
4) check if target in the range of [mid+1, right] (i.e. nums[mid]<target <= nums[right]), if so, do search in the second half, i.e. left = mid+1; otherwise search in the first half right = mid-1; The only difference is that due to the existence of duplicates, we can have nums[left] == nums[mid] and in that case, the first half could be out of order (i.e. NOT in the ascending order, e.g. [3 1 2 3 3 3 3]) and we have to deal this case separately. In that case, it is guaranteed that nums[right] also equals to nums[mid], so what we can do is to check if nums[mid]== nums[left] == nums[right] before the original logic, and if so, we can move left and right both towards the middle by 1. and repeat.
dong.wang.1694
*/
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = , right = nums.size()-, mid; while(left<=right)
{
mid = (left + right) >> ;
if(nums[mid] == target) return true; // the only difference from the first one, trickly case, just updat left and right
if( (nums[left] == nums[mid]) && (nums[right] == nums[mid]) ) {++left; --right;} else if(nums[left] <= nums[mid])
{
if( (nums[left]<=target) && (nums[mid] > target) ) right = mid-;
else left = mid + ;
}
else
{
if((nums[mid] < target) && (nums[right] >= target) ) left = mid+;
else right = mid-;
}
}
return false;
}
};
33. Search in Rotated Sorted Array & 81. Search in Rotated Sorted Array II的更多相关文章
- leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...
- LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>
LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...
- LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- 【Leetcode】81. Search in Rotated Sorted Array II
Question: Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? ...
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- 【LeetCode】81. Search in Rotated Sorted Array II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/search-in ...
- LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- 81. Search in Rotated Sorted Array II (中等)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
随机推荐
- 对象&内置对象& 对象构造 &JSON&__proto__和prototype
原型是一个对象,其他对象可以通过它实现属性继承 原型链:每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__pro ...
- CF 910 C. Minimum Sum
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/910/problem/C] 题意 给你n个字符串,每个字符串的字符是a~j,每个字符都可以是0~ ...
- 【个人博客作业Week7】软件工程团队项目一轮迭代感想与反思
(发布晚原因:发到团队博客了 一.关于银弹 在佛瑞德·布鲁克斯于1986年发布的<没有银弹:软件工程的本质性与附属性工作>这篇软件工程的经典论文中,作者向我们讲述了软件工程没有银弹这样的理 ...
- 第七周linux内核分析
可执行程序的装载 作者 黎静+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...
- Maven遇到github引用的项目有bug怎么办?
Maven遇到github引用的项目有bug,自己想要修复/作者已经修复了但是还没有版本出来. 一个maven的做法 git clone 该项目(可能直接下载zip比较快). 在项目中mvn inst ...
- Python学习笔记——Python Number(数字)
Python Number 类型转换 int(x, y) #将x转换为一个整数,y为进制数.如 int('11',2)将二进制数的11转成十进制数的整数,结果为3 long(x, y) #将x转换为一 ...
- SSM(Spring +SpringMVC + Mybatis)框架搭建
SSM(Spring +SpringMVC + Mybatis)框架的搭建 最近通过学习别人博客发表的SSM搭建Demo,尝试去搭建一个简单的SSMDemo---实现的功能是对用户增删改查的操作 参考 ...
- [日常工作] Inspur 服务器安装ESXi的简单过程
1. 公司里面使用虚拟化来进行功能测试 性能测试, 现阶段和之前主要是用虚拟机来搞. 前期用过hyperV 但是感觉 没有SystemCenter的VMM的授权比较难搞一些. 所以还是用ESXi的多了 ...
- msql 复杂练习
https://blog.csdn.net/xiao__oaix/article/details/78122294 customer表branch 表account 表 depositor 表loan ...
- children和childNodes 的区别
1.childNodes 属性,标准的,它返回指定元素的子元素集合,包括html节点,所有属性,文本.可以通过nodeType来判断是哪种类型的节点,只有当nodeType==时才是元素节点,是属性节 ...