二分查找:
//时间复杂度O(logN) 空间复杂度O(1)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (right >= left)
{
int mid = (right+left) / 2;
if (nums[mid] == target)
return mid;
if (nums[mid] > target)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
};
//思路1:对每一行进行二分查找
//时间复杂度O(MN) 空间复杂度O(1)
class Solution {
public:
bool binary_search(vector<int>&vi,int target)
{
int left=0,right=vi.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(vi[mid]==target)
return true;
else if(vi[mid]<target)
left=mid+1;
else
right=mid-1;
}
return false;
}
bool Find(int target, vector<vector<int> > array) {
for(auto&it:array)
{
if(binary_search(it,target)) return true;
}
return false;
}
};
//思路2:找规律
//时间复杂度O(M+N) 空间复杂度O(1)
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.size()==0) return false;
int r=array.size();
int l=array[0].size();
int left=0,down=r-1;
while(left<l && down>=0)
{
int tmp=array[down][left];
if(tmp==target)
return true;
else if(tmp<target) left++;
else down--;
}
return false;
}
};
//时间复杂度O(logN) 空间复杂度O(1)
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left=0,right=nums.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]>nums[mid+1])
right=mid;
else
left=mid+1;
}
return right;
}
};