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

 704. 二分查找

题目来源:  leetcode Problems 704. Binary Search

二分法于我学习算法而言如同abandon于我学习有序英语单词,每每拾起算法都会从二分法开始学习。经过多次学习,这是我最喜欢的二分法讲解

写对二分查找不是套模板并往里面填空,需要仔细分析题意_liweiwei1419的博客-CSDN博客

 下面是根据上面的讲解去做题实践中得出的三个要点

1. 循环中止条件为不满足while(left < right)

这并不代表什么开闭区间,单纯的为循环条件。当 left 与 right 重合的时候,我们就找到了问题的答案,使用这种写法有一个巨大的好处,那就是返回值不需要考虑返回 left 还是 right,因为退出循环以后,它们是重合的。

2. 根据实际情况缩小搜索区间

二分查找只有一个思想,那就是:逐步缩小搜索区间。根据mid索引对应的数组值与target的关系,结合题意,确定下一个搜索区间。有[left, mid - 1][mid, right][left, mid][mid + 1, right]两种确定下一个搜索区间的写法。

3. 根据搜索区间写法判断在计算mid时是否需要加1

由于系统在计算整型变量时是向下取整的,设想最后只剩下两个相邻的索引,此时计算mid值一定会得出left的值,若是[left, mid - 1][mid, right]这种下一搜索区间,会出现死循环,因此在此种下一搜索区间的写法里,计算mid值时需要加1。

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

 27.移除元素

题目来源:leetcode Problems 27. remove-element


双指针。fast指针遍历数组中的元素,若fast索引对应的值不等于val,将此时fast索引对应的值赋给slow索引的数组值,slow索引加1;若Fast索引对应的值等于val,无事发生。

最终数组中的等于val的值都被后面索引的值覆盖,slow的值为剩余的数组长度的值

int removeElement(int* nums, int numsSize, int val){
    int fast = 0, slow = 0;
    while(fast < numsSize)
    {
        if(nums[fast] != val)
        {
            nums[slow++] = nums[fast];
        }
        fast++;
    }
    return slow;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值