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

文档讲解:https://www.programmercarl.com/

视频讲解:http://【数组中移除元素并不容易! | LeetCode:27. 移除元素】 https://www.bilibili.com/video/BV12A4y1Z7LP/?share_source=copy_web&vd_source=70cb2783ee937aaa028937f61860b447

http://【手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找】 https://www.bilibili.com/video/BV1fA4y1o715/?share_source=copy_web&vd_source=70cb2783ee937aaa028937f61860b447

虽然是刚开始进训练营,但第一天的内容还是比较轻松的。主要就是涉及到数组的知识。

704.二分查找

感受:因为之前有做过类似的题,了解过算法思路,因此今天再次做起相当于复习和巩固了。很好理解,并不难。

思路:对于给定的数组和一个目标指针,我们采用二分法就需要定义多个指针分别标记数组中间、最左端和最右端。需要注意的是解题的边界类似于数学不等式一样,有左闭右闭、左闭右开、左开右闭之分。严格来讲理解的难易程度都相同,但我们解题时要保证界限相同,从一而终。我们描述的每个判定语句都要遵从同一种边界划分。以下是我用c++写的左闭右闭的代码:

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 - left) >> 1);
        if(nums[middle] > target){
          right = middle - 1;
        }
        else if(nums[middle] < target){
          left = middle + 1;
        }
        else return middle;
      }
      return -1;
    }
};

27.元素移除

感受:因为题刷的少的缘故吧,最开始看到27题时还没想到用什么方法,可能也就是暴力解法。看了卡哥视频后意识到这题有更好的做法,代码也可以更简洁。

思路:挺好理解的,双指针法。定义两个指针,这里为了形象的理解我们也像卡哥一样把两个指针称为快、慢指针。其中快指针进行遍历,扫描给定数组中每个元素;慢指针同时遍历,判断快指针是否扫描到目标元素,若没有就计数,同时快指针赋值给慢指针,相当于慢指针记录了被覆盖的目标元素的原数组下标。代码如下,十分简洁:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for(int fast = 0; fast < nums.size(); fast++){
            if(nums[fast] != val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
};

一句话总结:今日学时3h,总体状态良好,希望能一直坚持下去。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值