代码随想录算法训练营day1

代码随想录算法训练营

—day1


前言

今天是算法营的第一天,希望自己能够坚持下来!
今日任务:
数组理论基础,704. 二分查找,27. 移除元素 977.有序数组的平方


一、数组理论基础

文章链接

数组是存放在连续内存空间上的相同类型数据的集合。

需要注意的是:
1.数组下标都是从0开始的。
2.数组内存空间的地址是连续的。
3.数组的元素是不能删的,只能覆盖。

所以对于数组的增加和删除元素,需要移动覆盖其他的元素。

二、704. 二分查找

题目链接
文章讲解
视频讲解

二分查找的前提是:
1.数组有序
2.无重复元素

思路:
1.确定取值范围,[0,n]还是[0,n)
2.确定二分的各个条件 if,else的逻辑

1.方法一:左闭右闭

代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //[0,n]
        //找target=nums[m]
        int l = 0, r = nums.size() -1; //数组下标是从0开始的,最大是n-1
        while (l <= r) {
            int m = l - (l-r)/2;

            if (target == nums[m])
            {
                return m;
            } 
            else if (target < nums[m])
            {
                //[a,m-1]
                r = m - 1;
            } else
            {
                //[m+1, r]
                l = m + 1;
            }
        }

        return -1;
    }
};

2.方法二:左闭右开

代码如下(示例):

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //[0, n)
        int l = 0, r = nums.size();

        while (l < r) {
            int m = l - (l - r) / 2;

            if (nums[m] > target) {
                //[l, m)
                r = m;
            } else if (nums[m] < target) {
                //[m+1, r)
                l = m + 1;
            } else {
                return m;
            }
        }
         return -1;
    }
};

三、27. 移除元素

题目链接
文章讲解
视频讲解

1.暴力解法

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //暴力解法,双循环
        int n = nums.size();

        for (int i = 0; i < n; i++)
        {
            if (nums[i] == val)
            {
                //找到目标值后,后面的数组整体向前移动
                for (int j = i+1; j < n; j++)
                {
                    nums[j-1] = nums[j];
                }

                i--; //因为更新了数组,nums[i]的值已经更新了,需要重新判断新的nums[i]
                n--; //更新数组的新大小
            }
        }
        return n;
    }
};

2.双指针

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //双指针法
        //定义两个指针
        //快指针:寻找新数组所需要的元素,替换到慢指针上
        //慢指针:需要替换元素的位置(val=nums[slow]的位置)
        int slow = 0 , fast = 0;
        
        while(fast < nums.size()) {
            if (val!= nums[fast]) {
                nums[slow] = nums[fast];
                slow ++;
            }
            fast ++;
        }

        return slow;
    }
};

977.有序数组的平方

题目链接
文章讲解
视频讲解

1.暴力解法

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //暴力解法,时间复杂度O(n+nlogn)
        for (int i=0; i < nums.size(); i++)
        {
            nums[i] = nums[i] * nums[i];
        }

        sort(nums.begin(), nums.end()); //快速排序
        return nums;
    }
};

2.双指针

思路:

  • 有序数组,平方后的最大只会出现在头或尾
  • 使用双指针,比较头尾平方后的数谁更大,把更大的放在新数组里
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        //定义一个新数组,用于存放结果
        //k指向新数组的最后
        int k = nums.size()-1;
        vector<int> ret (nums.size(), 0);

        for(int i=0,j=nums.size()-1;i<=j;) //当i=j时,也需要处理那单个元素
        {
            if (nums[i]*nums[i] < nums[j]*nums[j])
            {
                ret[k--] = nums[j]*nums[j];
                j--;
            } else {
                ret[k--] = nums[i]*nums[i];
                i++;
            }
        }

        return ret;
    }
};

总结

今天主要是学会了二分法和双指针的用法。
双指针有两种:
1.同一边开始遍历的快慢指针;
2.分别从头尾遍历的双指针;

明天继续加油!

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第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、付费专栏及课程。

余额充值