继续对leetcode中的数组数据结构的题型进行归纳:
本节主要是二分法的使用方式:
leetcode33:在一个倒置的数组中寻找相应的元素,返回其索引:
思路:使用遍历算法:时间复杂度为O(n)
使用二分法查找:变形的二分法查找,通过判断nums[mid]和nums[rights]的大小来判断相应的去取值区间:
C++代码如下
class Solution {
public:
int search(vector<int>& nums, int target) {
//直接使用遍历查找的时间复杂度是O(n)
//使用二分法查找的时间复杂度是O(logn)
//使用变形的二分法查找
int l = 0, r = nums.size()-1;
while (l<=r) {
int mid = (r-l)/2+l;
if (nums[mid] == target)
return mid;
if (nums[mid] < nums[r]) {
if (nums[mid]<target && target<=nums[r])
l = mid+1;
else
r = mid-1;
} else {
if(nums[l]<=target && target<nums[mid])
r = mid-1;
else
l = mid+1;
}
}
return -1;
}
};
运行时间为9ms
同理使用二分法查找leetcode34,leetcode35也都是属于二分法查找的变形版本;
leetcode35的C++代码如下:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
//还是用二分法查找 只是条件变了
int left=0;
int right=nums.size()-1;
if(target<=nums[0]){
return 0;
}
if(target>nums[right])
{
return right+1;
}
if(target==nums[right]){
return right;
}
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
return mid;
}
int temp1=mid-1;
int temp2=mid+1;
if(nums[mid]<target&&nums[temp2]>target){
return mid+1;
}
else if(nums[mid]>target&&nums[temp1]<target){
return mid;
}
else if(nums[mid]>target){
right=mid-1;
}
else{
left=mid+1;
}
}
}
};