代码随想录算法训练营第一天|704.二分查找、27.移除元素

参考内容:

代码随想录

代码随想录 (programmercarl.com)

704.

第一想法

1.middle依次和目标值作比较大于则向左缩进,小于则向右缩进

2.不能直接相加/2,会超范围

*超出了时间限制

//middle依次和目标值作比较大于则向左缩进,小于则向右缩进

int search(int* nums, int numsSize, int target){
    if(target<nums[0]||target>nums[numsSize-1])
    return -1;
    else
    {
    int left = 0,right = numsSize - 1;
    int middle = left+(right-left)/2;//不能直接相加/2,会超范围
    int i;
    //当middle不等于target时分别判断其与target的关系,一半一半的缩放
    while(nums[middle]!=target)
    {
        if(nums[middle]>=target)
        {
            right = middle;
            middle = left+(right-left)/2;
        }
        else
        {
            left = middle;
            middle = left+(right-left)/2;
        }
    }
    return middle;
    }
}

无法判断target没在里面的情况

改正:

先确定好区间范围再写while里面的判断条件以及middle的赋值

//先找好而二分法的区间是左闭右闭还是左开右闭等
//以[left,right]区间为讨论
int search(int* nums, int numsSize, int target){
    int left = 0,right = numsSize-1;
    while(left<=right)//left = right有效
    {
        int middle = left+(right-left)/2;
        if(nums[middle]<target)
        {
            left = middle+1;//nums[middle]肯定不是目标值;
            middle = left+(right-left)/2;
        }
        else if(nums[middle]>target)
        {
            right = middle - 1;//同理
            middle = left+(right-left)/2;
        }
        else 
        return middle;
    } 
    return -1;
    
}

另一种写法

不同:初始l与r时r是numsSize,而不用减一

int search(int* nums, int numsSize, int target){
    int left = 0,right = numsSize;
    while(left<right)
    {
        int middle = left+(right-left)/2;
        if(nums[middle]<target)
        {
            left = middle+1;
            middle = left+(right-left)/2;
        }
        else if(nums[middle]>target)
        {
            right = middle;
            middle = left+(right-left)/2;
        }
        else 
        return middle;
    } 
    return -1;
    
}

27.

双指针

//双指针,快指针找新数组所需要的元素,满指针即为新数组

int removeElement(int* nums, int numsSize, int val){
    int slow = 0;
    for(int fast = 0;fast < numsSize;fast++)
    {
        if(nums[fast]!=val)
        {
            nums[slow++]=nums[fast];//找到要求数组,slow加一
        }
    }

    return slow;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值