代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
704. 二分查找
题目链接:704.二分查找
文档讲解:704.二分查找
视频讲解:704.二分查找
思路
二分法:数学概念
重点
区间是[左闭右开)还是[左闭右闭]
左闭右闭:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0, right=nums.size() -1;
while(left <= right)
{
int middle =(left + right)/ 2;
if(nums[middle] < target) left=middle+1;
else if(nums[middle] > target) right=middle-1;
else return middle;
}
return -1;
}
};
左闭右开
右边界是一个越界值,不在vector里面,所以最初定义就是越界值。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0, right=nums.size();
while(left < right)
{
int middle =(left + right)/ 2;
if(nums[middle] < target) left=middle+1;
else if(nums[middle] > target) right=middle;
else return middle;
}
return -1;
}
};
二分法
35.搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
int middle;
while(left <= right)
{
middle = (left + right) / 2;
if(nums[middle] > target) right = middle-1;
else if(nums[middle] < target) left = middle +1;
else return middle;
}
if(nums[middle] < target) return middle + 1;
else return middle;
}
};
- 在排序数组中查找元素的第一个和最后一个位置
写不出来;
27. 移除元素
题目链接:27. 移除元素
文档讲解:27. 移除元素
视频讲解:27. 移除元素
思路
双指针,vector 数组里面数据只能覆盖不能删除,数组是一个连续类型相近的数据类型集合,
erase删除函数操作时间复杂度O(n);
重点
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int fast = 0;fast<nums.size();fast++)
{
if(nums[fast] != val)
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
};