打卡第一天 , LC704二分查找, 和LC27移除元素

文章介绍了如何在有序整型数组中使用二分查找算法寻找目标值的下标,以及如何在不使用额外空间的情况下,使用双指针法原地移除指定元素。两种方法都展示了在IT技术中的高效数据处理技巧。

给定一个 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;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值