力扣704-二分查找
二分查找binary search是通过循环对比数组的中间值nums[middle]和目标值target来查找特定元素。如果中间值nums[middle]大于目标值target,则右边界等于middle;如果中间值nums[middle]小于目标值target,则左边界等于middle。一般写法有两种,左闭右闭和左闭右开,即[a,b]和[a,b)。
左闭右闭写法
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int left = 0;//左边界
int right = nums.size()-1;//右边界
while(left<right)//左闭右开情况下,左边界不等于右边界
{
int middle=(left+right)/2;//中间值
//边界处理
if(nums[middle]>target)
{
//在左闭右开的情况下,nums[middle]一定不是我们搜素的值,right则应该是middle-1
right=middle-1;
}
else if(nums[middle]<target)
{
//在左闭右开的情况下,nums[middle]一定不是我们搜素的值,left则应该是middle+1
left=middle+1;
}
else //等于则返回
{
return middle;
}
}
return -1;
}
};
左闭右开写法
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int left = 0;//左边界
int right = nums.size();///左闭右开情况下,右边界不包含right,所以直接等于nums.size()
while(left<right)//左闭右开情况下,左边界不等于右边界
{
int middle=(left+right)/2;//中间值
//边界处理
if(nums[middle]>target)
{
//在左闭右开的情况下,本身就不包含middle,right则应该是middle-1
right=middle;
}
else if(nums[middle]<target)
{
//在左闭右开的情况下,nums[middle]一定不是我们搜素的值,left则应该是middle+1
left=middle+1;
}
else //等于则返回
{
return middle;
}
}
return -1;
}
};
力扣27-移除元素
移除数组的特定元素
暴力解法-两层for循环
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//暴力解法,两层for循环
int size=nums.size();//数组长度
for(int i=0;i<size;i++)//遍历数组元素
{
if(nums[i]==val)//如果数组元素等于需要移除的元素,则将后面所有的元素往前移动一位
{
for(int j=i+1;j<size;j++)//将后面所有的元素往前移动一位
{
nums[j-1]=nums[j];//覆盖前一位数组元素
}
i--;//从新数组的第i位继续遍历
size--;//数组长度减小一位
}
}
return size;//返回新数组长度
}
};
双指针解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针
//快指针是寻找新数组里所需要的元素,慢指针是新数组的下标值
int slow=0;//数组下标从0开始
for(int fast=0;fast<nums.size();fast++)//快指针遍历数组元素
{
if(nums[fast]!=val)//如果数组元素不等于需要移除的元素,则写入新数组
{
nums[slow++]=nums[fast];//写入一个元素之后,慢指针移动一位,数组长度+1,slow++
}
}
return slow;//返回新数组长度
}
};