Leetcode题解(十二)

时间:2023-03-10 01:37:49
Leetcode题解(十二)

33、Search in Rotated Sorted Array

题目

Leetcode题解(十二)

这道题目如果没有其他要求,直接遍历一遍就可以知道答案,但是,题目给出了是排序了数组,但是数组有可能经过了旋转得到,其解题思路仍然是二分查找,只不过在处理的时候需要添加一下逻辑处理;

在做逻辑判断的时候,主要判断的是target可能位于middle的坐标还是右边,这样才能确定应该执行first = middle+1还是second = middle - 1;

旋转后的数组可以分为两部分,前一部分是数组递增部分,如[4,5,6,7],后一部分是[0,1,2]

代码如下:

 class Solution {
public:
int search(vector<int>& nums, int target) {
int first,second,middle;
first = ;
second = nums.size() - ; while (first <= second)
{
middle = (first + second)/;
if(target == nums[middle])
return middle;
if(nums[middle] >= nums[first] && nums[middle] >= nums[second])//middle位于前一部分并且first在前一部分,second在后一部分
{
if(target >= nums[first] && target > nums[middle])//middle可能位于前一部分,并且位于middle右边,所以first=middle+1
first = middle+;
else if(target >= nums[first] && target < nums[middle])//middle可能位于前一部分,并且位于middle的左边
second = middle-;
else
first = middle+;
}
else if(nums[middle] <= nums[first] && nums[middle] <= nums[second])//middle位于后一部分,并且first位于前一部分,second位于后一部分
{
if(target <= nums[second] && target < nums[middle])
second = middle-;
else if(target <= nums[second] && target > nums[middle])
first = middle+;
else
second = middle-;
}
else //first和second位于同一部分,就退化为普通的二分查找了
{
if(target > nums[middle])
first = middle+;
else
second = middle-;
}
} return -; }
};

--------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------

34、Search for a Range

题目

Leetcode题解(十二)

这道题目是二分法的具体应用,直接上代码;

 class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int first,second,middle;
const int size = nums.size();
vector<int> res; first = ;
second = size - ; while(first <= second)
{
middle = (first + second)/;
if(target == nums[middle])
break;
else
{
if(target > nums[middle])
first = middle+;
else
second = middle-;
}
}
int t;
if(first <= second)
{
t = middle;
while(target == nums[t]&&t>=)
t--;
t++;
res.push_back(t);
t=middle;
while(target == nums[t]&&t<size)
t++;
t--;
res.push_back(t); }
else
{
res.push_back(-);
res.push_back(-);
}
return res;
}
};

-----------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------

35、Search Insert Position

题目

Leetcode题解(十二)

二分查找的应用,直接代码:

 class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
const int size = nums.size();
if( == size)
return ; int first,second,middle;
first = ;
second = size - ; while(first < second)//注意没有用<=
{
middle = (first + second)/;
if (target == nums[middle])
{
return middle;
}
else if (target > nums[middle])
{
first = middle+;
}
else
second = middle-;
} if(target > nums[first])
return first+;
else
return first; }
};