题目列表
- 162 Find Peak Element
- 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
162. Find Peak Element
题解
二分
对于l, r, mid
分析三个点mid, mid-1, mid+1
1.nums[ mid ] > nums[ mid - 1 ] && nums[ mid ] > nums[ mid + 1 ]
2.nums[ mid ] > nums[ mid - 1 ] && nums[ mid ] < nums[ mid + 1 ]
3.nums[ mid ] < nums[ mid - 1 ] && nums[ mid ] > nums[ mid + 1 ]
4.nums[ mid ] < nums[ mid - 1 ] && nums[ mid ] < nums[ mid + 1 ]
注意mid为0或n-1的情况
代码
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
if( n == 1 ) return 0;
while( l <= r )
{
int m = l + r >> 1;
if( m == 0 && nums[ m ] > nums[ m + 1 ] ) return m;
if( m == n - 1 && nums[ m ] > nums[ m - 1 ] ) return m;
if( nums[ m ] > nums[ m - 1 ] && nums[ m ] > nums[ m + 1 ] ) return m;
if( nums[ m ] < nums[ m + 1 ] ) l = m + 1;
else r = m - 1;
}
}
};
153. Find Minimum in Rotated Sorted Array
题解
二分
分析三个点l, mid, r
1.nums[ mid ] < nums[ r ]
2.nums[ mid ] > nums[ r ]
代码
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
while( l < r )
{
int mid = l + r >> 1;
if( nums[ mid ] < nums[ r ] ) r = mid;
else l = mid + 1;
}
return nums[ r ];
}
};
154. Find Minimum in Rotated Sorted Array II
题解
二分
分析三个点l, mid, r
1.nums[ mid ] < nums[ r ]
2.nums[ mid ] == nums[ r ]
3.nums[ mid ] > nums[ r ]
代码
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
int l = 0, r = n - 1;
while( l < r )
{
int mid = l + r >> 1;
if( nums[ mid ] < nums[ r ] ) r = mid;
else if( nums[ mid ] == nums[ r ] )
{
int flag = -1;
for( int i = mid + 1; i <= r; ++ i )
{
if( nums[ i ] != nums[ mid ] )
{
flag = i;
break;
}
}
if( flag == -1 ) r = mid;
else l = flag;
}
else l = mid + 1;
}
return nums[ r ];
}
};
153与154总结
注意while( l < r )这个条件
在153中,可以写成 while( l <= r )
分析下当l == r 时, l == mid, mid == r, 此时 l = mid + 1,会退出循环
在154中, 不能写成 while( l <= r )
分析下当l == r 时, l == mid, mid == r, 此时 r = mid, 会产生无限循环
所以说二分的写法不是固定的,根据题目的要求,具体写法也不同.
33. Search in Rotated Sorted Array
题解
二分
分析三个点l, mid, r 和target的值
1. nums[ mid ] == target
2. nums[ mid ] < target
3. nums[ mid ] > target
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n - 1;
while( l <= r )
{
int mid = l + r >> 1;
if( nums[ mid ] == target ) return mid;
else if( nums[ mid ] < target )
{
if( nums[ mid ] > nums[ l ] ) l = mid + 1;
else if( target > nums[ r ] ) r = mid - 1;
else l = mid + 1;
}
else
{
if( nums[ mid ] < nums[ r ] ) r = mid - 1;
else if( target < nums[ l ] ) l = mid + 1;
else r = mid - 1;
}
}
return -1;
}
};
81. Search in Rotated Sorted Array II
题解
int a = mid, b = mid;
while( nums[ mid ] == nums[ a ] && a >= l ) -- a;
while( nums[ mid ] == nums[ b ] && b <= r ) ++ b;
代码
class Solution {
public:
bool search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n - 1;
while( l <= r )
{
int mid = l + r >> 1;
if( nums[ mid ] == target ) return true;
int a = mid, b = mid;
while( nums[ mid ] == nums[ a ] && a >= l ) -- a;
while( nums[ mid ] == nums[ b ] && b <= r ) ++ b;
if( a == l - 1 && b == r + 1 ) return false;
if( a == l - 1 )
{
l = b;
continue;
}
if( b == r + 1 )
{
r = a;
continue;
}
if( nums[ mid ] < target )
{
if( nums[ mid ] > nums[ l ] ) l = b;
else if( target > nums[ r ] ) r = a;
else l = b;
}
else
{
if( nums[ mid ] < nums[ r ] ) r = a;
else if( target < nums[ l ] ) l = b;
else r = a;
}
}
return false;
}
};
你写的东西被原文抄袭了,我百度发现的。
https://www.dazhuanlan.com/2019/12/18/5df9a7a98efcf/
十分感谢!这个可能是个专门爬文章的博客。
这没办法的事情,这个应该是爬虫
赞!