【代码随想录算法训练营day01】

代码随想录算法训练营第一天|数组理论基础,704.二分查找,27.移除元素

1.LeetCode 704二分查找

1.1题目链接:704.二分查找

文档讲解:代码随想录
视频讲解:代码随想录算法公开课

1.2 思路:看到题目第一想法就是暴力解法,但是考虑到实际要求是不可以的,采用二分法进行区间分割查找速度会更快。对于二分法左闭右闭比较熟悉,但是左闭右开的不太熟悉,容易搞混二者,通过看视频讲解理清二者区别:主要是看等号成立时左右都闭合情况是否符合实际,另外需要注意二分法应用的条件:有序数组元素不重复。

1.3 附加代码如下:

在这里插入代码片
//二分法左闭右闭情况
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)/2;
            if(nums[middle]>target)
            {
                right=middle-1;

            }
            else if(nums[middle]<target)
            {
                left=middle+1;
            }
            else
            {
                return middle;
            }
        }
        return -1;

    }
};

//二分法左闭右开情况
class Solution{
    public:
    int search(vector<int>& nums,int target){
        int left=0;
        int right=nums.size();
        while(left<right)
        {
            int middle=(left+right)/2;
            if(nums[middle]>target)
            {
                right=middle;
            }
            else if(nums[middle]<target)
            {
                left=middle+1;
            }
            else
            {
                return middle;
            }

        }
        return -1;

    }
};

1.4 补充练习

Leetcode 35.搜索插入位置 题目链接
Leetcode 34.在排序数组中查找元素的第一个和最后一个位置 题目链接(后续补充)

2.Leetcode移除元素

2.1题目链接:移除元素

文章讲解:代码随想录
视频讲解:卡哥视频讲解

2.2 思路:看到题目的第一想反应还是去用暴力列举法,两个for循环进行遍历实现目的。看了代码随想录的B站视频掌握了使用双指针实现遍历,从时间复杂度上O(n×n)->O(n)

2.3 附加代码如下(包括暴力列举法和双指针法)

双指针原理:采用初始为零的两个指针,快指针进行原数组元素遍历,当满足遍历中的元素值不等于要删除的元素值,则将该元素值赋给慢指针,这样慢指针保留下来的就是满足题目要求的新数组。类似于读写操作一样,一个负责读取数据一个负责记录满足条件的数据。
2.3.1暴力列举法

class Solution{
public:
    int removeElement(vector<int>& nums, int val){
        int length=nums.size();
        for(int i=0;i<length;i++)
        {
            if(nums[i]==val)
            {
                for(int j=i+1;j<length;j++)
                {
                    nums[j-1]=nums[j];//思考一下如果是删除最后一个元素,要覆盖的话怎么成立,其实就是那后面没有给定初始值(默认为零)的覆盖
                }
                i--;//思考一下为什么有这一步,是不是因为数组元素都向前移动一步
                length--;
                
            }
            
            
        }
        return length;
    }
};

2.3.2 双指针法

class Solution {
public:
       int removeElement (vector<int>& nums,int val){
           int slow=0;
           int fast;
           int length=nums.size();
           for(fast=0;fast<length;fast++)
           {
               if(nums[fast]!=val)
               {
                   nums[slow]=nums[fast];
                   slow++;
               }
           }
           return slow;
       }
};
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值