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

简介: 704 27

LeetCode 704 二分查找

题目链接:704.二分查找

二分法简单,细节是魔鬼,这个我是看了卡哥的视频,目前已经熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法

image-20230215081153090

注意两者的异同点。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        // int left = 0;
        // int right = nums.size() - 1;
        // // 左闭右闭的写法 左闭右开在下面right赋值不需要减一
        // while ( left <= right ){
        //     // c++定义基础不牢固,定义变量要加上变量类型
        //     int middle = left + ( right - left ) / 2; //防止溢出
        //     if ( nums[middle] > target ){
        //         right = middle -1;
        //     }
        //     else if ( nums[middle] < target ){
        //         left = middle + 1;
        //     }
        //     else{
        //         return middle;
        //     }
        // }
        // return -1;
        
        // 左闭右开写法
        int left = 0;
        int right = nums.size();
        // 左闭右闭的写法 左闭右开在下面right赋值不需要减一
        while ( left < right ){
            // c++定义基础不牢固,定义变量要加上变量类型
            int middle = left + ( right - left ) / 2; //防止溢出
            if ( nums[middle] > target ){
                right = middle;
            }
            else if ( nums[middle] < target ){
                left = middle + 1;
            }
            else{
                return middle;
            }
        }
        return -1;

    }
};
  • 时间复杂度:O(log n ),其中 n是数组的长度。
  • 空间复杂度:O(1)

LeetCode 27 移除元素

题目链接:27.移除元素

思路:这个题就相当于让实现库函数erase。

讲解视频

image-20230215085101986

暴力解法和双指针解法两种

暴力解法使用两层for ,第一层遍历整个数组,第二层用来更新覆盖数组 O(n^2) O(1)

双指针法定义两个指针,fast指针用来遍历数组找到target,slow指针用来更新数组中的元素从而实现覆盖 O(n) O(1)

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];
                slow += 1;
            }
        }
        return slow;
        
        // // 暴力解法
        // 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];
        //         }
        //         i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
        //         size--; // 此时数组的大小-1
        //     }
        // }
        // return size;
        
        //暴力中的i--是因为覆盖后下标i以后的数值都向前移动了一位,如果i不向前移动,就会导致无法删除两个相邻的val eg:[1,2,2,3,4] 2

    }
};
// 其次要注意本题的返回值
相关文章
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
181 65
|
4天前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
15 3
|
14天前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
22天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
15 0
|
6天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
6天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
29天前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
7天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
9天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
|
9天前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。