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

本文介绍了二分查找算法在不同情况下的实现(左闭右闭和左闭右开),以及在LeetCode问题中的应用,包括搜索插入位置和移除元素,重点讲解了双指针法(快慢指针)和暴力解法。作者回顾了基本的数组操作并计划使用C++进行刷题。
摘要由CSDN通过智能技术生成

704.二分查找

题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

左闭右闭:(low 和 high 的值都能取到—>初始值如何设置、while循环条件、low和high更新后的位置)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(target < nums[0] || target>nums[nums.size()-1])
            return -1;
        int low,mid,high;
        high = nums.size()-1;
        low=0;
        while(low<=high)
        {
            mid = (low+high)/2;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]<target)
                low = mid+1;
            else
                high = mid-1;
        }
        return -1;
    }
};

左闭右开:(low 的值能取到,high取不到—>初始值如何设置、while循环条件、low和high更新后的位置)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(target < nums[0] || target>nums[nums.size()-1])
            return -1;
        int low,mid,high;
        high = nums.size();
        low=0;
        while(low<high)
        {
            mid = (low+high)/2;
            if(nums[mid]<target)
                low = mid+1;
            else if(nums[mid]>target)
                high = mid;
            else
                return mid;
        }
        return -1;
    }
};

35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置——没时间做了。

27.移除元素

题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

双指针法(快慢指针),留下的一点记忆目前还够自己写出来。

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

标准双指针(参考答案)

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

暴力解法:双重循环,每检测到一个目标值,就遍历剩余元素前移一位。(令j=i+1,好判断是否越界)。注意i完成覆盖之后要自动+1,所以在每一轮最后数组规模要减去一个被覆盖的,i也要减一。

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

好久没写编程题,最简单的数组也回忆了一下,一看讲解视频非常熟悉啊,慢慢开始。
C++比较熟,java后期再开始复习,还是先用C++刷题啦。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值