连云港市网站建设hao123主页
文章目录
- 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.思路