给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left =0;
int right = nums.size()-1; //这里写-1 代表是 左闭右闭的区间
while(left <= right) // 左闭右闭的区间中 , left =right的时候是有意义的
{ long mid = (left + right) / 2;
if(nums[mid] == target)
{
return mid;
}
else if(nums[mid] < target) //在mid的右边
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
};
另一种写法是左闭右开的写法
其区别在于边界的判断
int right = nums.size();
...
while(left < right) //这时候 left = right 的时候是没有意义的,因为right取不到
...
left =mid+1;//左边的赋值依旧是 +1,因为左边是闭区间
...
right = mid; //右边就不用+1了, 因为是开区间
LC27
题干如下
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 1) 暴力循环
int len = nums.size();
for(int i = 0 ; i < len; i++)
{
if(nums[i] == val) //找到删除的元素后,将其后的元素向前移动
{
for(int j = i+1;j <len ;j++)
{
nums[j-1] = nums[j];
}
len --;//移除了一个元素,长度-1
i--; // i以及i以后的元素都往前移了一位,原来i的位置是原来i+1的元素,这里不-1的话 ,下一轮会变成i+1,那么原来i+1的元素(现在在i)就被略过了
}
}
return len;
接下来是双指针法的解法
int slowpointer = 0;
for(int i = 0; i< nums.size();i++)
{
if(nums[i] != val)
{
nums[slowpointer] = nums[i];
slowpointer ++; //这里加了1 ,所以最后不用+1
}
}
return slowpointer;
文章介绍了如何在有序整型数组中使用二分查找算法寻找目标值的下标,以及如何在不使用额外空间的情况下,使用双指针法原地移除指定元素。两种方法都展示了在IT技术中的高效数据处理技巧。

837

被折叠的 条评论
为什么被折叠?



