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. ...
随机推荐
- required: true,el-upload :action="UploadUrl()"
<el-form-item label="所属班级:" prop="Name" :rules="[{ required: true, messa ...
- 12.26daily_scrum
尽管最近是众多大作业集中爆发deadline的紧要关头,队员们依旧热情高涨,投入良多,纷纷为产品发布出谋划策. 具体工作: 小组成员 今日任务 工作时间 李睿琦 软件调试过程总结 2 左少辉 滑锁密码 ...
- Spring配置常识
(1)数据源配置 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" ...
- [BUAA_SE_2017]案例分析-Week3
Week3 案例分析 一.调研评测 案例: 神策数据的数据概览功能 Demo: 电商类产品Demo 评价: d) 好,不错 个人评价:神策数据电商类产品Demo的数据概览功能是相当不错的.首先点击进入 ...
- 自己实现数据结构系列二---LinkedList
一.先上代码: 1.方式一: public class LinkedList<E> { //节点,用来存放数据:数据+下一个元素的引用 private class Node{ privat ...
- ADOquery属性中cursortype,LockType属性
ADOquery属性中cursortype属性 ctOpenForwardOnly 向前移动 - — 除了只能在记录集中向前移动以外,其它的和动态游标类似. ctKeyset 键集 ...
- Lodop窗口的按钮、权限,隐藏或设置功能不可用
Lodop隐藏某个按钮或部分,具体参考Lodop技术手册 SET_SHOW_MODE篇.以下是几个例子,(对应下图图片): 第一种:LODOP.SET_SHOW_MODE ("HIDE_PB ...
- QAU 17校赛 J题 剪丝带(完全背包变形)
题意: 剪一段丝带,对于剪完后的每一段丝带长度必须是a,b,c 输入丝带的长度 n 和 a b c 输出一个整数,代表最多能剪成多少段 样例输入 5 5 3 2 7 5 5 2 样例输出 2 ...
- POJ - 1062(昂贵的聘礼)(有限制的spfa最短路)
题意:...中文题... 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54350 Accepted: 16 ...
- MT【45】抛物线外一点作抛物线的切线(尺规作图题)
注1:S为抛物线焦点 注2:由切线的唯一性,以及切线时可以利用MT[42]评得到三角形全等从而得到切线平分$\angle MQS$得到