文章目录
- 1.二分查找
- 1.题目
- 2.解题思路
- 3. 解题代码
- 2.在排序数组中查找元素的第一个和最后一个位置
- 1.题目
- 2.算法原理
- 3. 代码
- 3.x的平方根
- 1.题目
- 2.代码
- 4.搜索插入位置
- 1.题目
- 2.解题思路
- 3.解题代码
- 5.山脉数组的索引
- 1.题目
- 2.解题思路
- 3. 代码
- 6.寻找峰值
- 1.题目
- 2.解题思路
- 3.代码
- 7. 寻找旋转排序数组中的最小值
- 7.1 题目
- 7.2 解题思路
- 7.3 代码
- 8.0~n-1中缺失的数字
- 1.题目
- 2.思路
- 3.代码
1.二分查找
1.题目
题目链接
2.解题思路
3. 解题代码
class Solution {
public:
int search(vector<int>& nums, int target) {
for(int left = 0, right = nums.size() - 1; left <= right; )
{
int mid = left + (right - left) / 2;
if(nums[mid] > target) right = mid - 1;
else if(nums[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
};
2.在排序数组中查找元素的第一个和最后一个位置
1.题目
题目链接
2.算法原理
3. 代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size(), left = 0, right = n - 1;
if(n == 0) return {-1, -1};
// 查找左端点
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else right = mid;
}
if(nums[left] != target) return {-1, -1};
int left1 = left;
right = n - 1;
//找右端点
while(left < right)
{
int mid = left + (right - left + 1) / 2;
if(nums[mid] <= target) left = mid;
else right = mid - 1;
}
return {left1, left};
}
};
3.x的平方根
1.题目
题目链接
2.代码
class Solution {
public:
int mySqrt(int x) {
long long left = 0, right = x;
while(left < right)
{
long long mid = left + (right - left + 1) / 2;
if(mid * mid <= x) left = mid;
else right = mid - 1;
}
return left;
}
};
4.搜索插入位置
1.题目
题目链接
2.解题思路
3.解题代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size(), left = 0, right = n - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < target) left = mid + 1;
else right = mid;
}
if(nums[left] >= target) return left;
else return left + 1;
}
};
5.山脉数组的索引
1.题目
题目链接
2.解题思路
3. 代码
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0, n = arr.size(), right = n - 1;
while(left < right)
{
int mid = left + (right - left + 1) / 2;
if(arr[mid] > arr[mid - 1]) left = mid;
if(arr[mid] < arr[mid - 1]) right = mid - 1;
}
return left;
}
};
6.寻找峰值
1.题目
题目链接
2.解题思路
3.代码
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, n = nums.size(), right = n - 1;
while(left < right)
{
int mid = left + (right - left+ 1) / 2;
if(nums[mid] > nums[mid - 1]) left = mid;
if(nums[mid] < nums[mid - 1]) right = mid - 1;
}
return left;
}
};
7. 寻找旋转排序数组中的最小值
7.1 题目
题目链接
7.2 解题思路
7.3 代码
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, n = nums.size(), right = n - 1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] > nums[right]) left = mid + 1;
if(nums[mid] <= nums[right]) right = mid;
}
return nums[left];
}
};
// 原来看题解的代码
class Solution {
public:
int findMin(vector<int>& nums) {
int left = -1;
int right = nums.size() - 1;
while(left + 1 < right)
{
int mid = left + (right - left) / 2;
if (nums[mid] < nums.back())
{
right = mid;
}
else
{
left= mid;
}
}
return nums[right];
}
};
8.0~n-1中缺失的数字
1.题目
(剑指offer的题目,所以不能免费做题)
2.思路