算法刷题Day1 二分查找+移除元素

这篇具有很好参考价值的文章主要介绍了算法刷题Day1 二分查找+移除元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

day1 数组part01

数组理论基础

代码随想录-数组-1.数组理论基础

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

优点:常数时间复杂度访问元素

缺点:在删除或者增添元素的时候,就难免要移动其他元素的地址,时间复杂度为O(n)

704. 二分查找

代码随想录-数组-2.二分查找

前提条件

二分查找前提条件:

  • 数组为有序数组
  • 数组元素无重复

满足以上两个条件的数组,查找元素时,一定要考虑二分查找

实现细节

溢出问题

计算中间索引的时候,要考虑防止溢出

错误的写法:int mid = (left + right) / 2left + right有可能超出int的范围

正确的写法:int mid = left + (right - left) / 2

确定边界条件

二分法最大的难点在于如何确定边界条件——根据查找区间的定义来做边界处理,要保持一致

原则:循环不变量规则(一致性)

  1. 先确定leftright是左闭右开[left, right)还是左闭右闭[left, right]left = 0左闭右开:right = nums.size(),左闭右闭:right = nums.size() - 1
  2. 确定while循环条件(左闭右开:while (left < right),左闭右闭:while (left <= right)
  3. 确定leftright的更新方法

二分法有两种写法:

左闭右开
int search(vector<int>& nums, int target) 
{
    int left = 0, right = nums.size(); // 左闭右开

    while (left < right) // 左闭右开while循环条件:当left == right时,说明区间内没有元素了
    {
        // int mid = (left + right) / 2; // 会溢出
        int mid = left + (right - left) / 2; // 正确操作

        if (nums[mid] < target) // target在mid的右侧,需要更新left
        {
            left = mid + 1; // 左闭
        }
        else if (nums[mid] > target) // target在mid的左侧,需要更新right
        {
            right = mid; // 右开
        }
        else
        {
            return mid;
        }
    }

    return -1;
}
左闭右闭
int search(vector<int> &nums, int target)
{
    int left = 0, right = nums.size() - 1; // 左闭右闭
    
    while (left <= right) // 左闭右闭while循环条件:当left > right时,说明区间内没有元素了
    {
        int mid = left + (right - left) / 2;
        
        if (nums[mid] < target) // target在mid右侧,需要更新left
        {
            left = mid + 1; // 左闭
        }
        else if (nums[mid] > target) // target在mid左侧,需要更新right
        {
            right = mid - 1; // 右闭
        }
        else 
        {
            return mid;
        }
    }
    
    return -1;
}

时间复杂度:O(logn)

空间复杂度:O(1)文章来源地址https://www.toymoban.com/news/detail-495454.html

27. 移除元素

代码随想录-数组-3.移除元素

使用双指针

实现细节

数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

定义快慢指针

  • 快指针:遍历 旧数组,寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
代码实现
int removeElement(vector<int>& nums, int val) 
{
    int fast = 0, slow = 0;

    while (fast < nums.size()) // 遍历数组
    {
        if (nums[fast] != val) // 寻找符合条件的元素,即不为val的元素
        {
            nums[slow] = nums[fast]; // 覆盖写入
            ++slow;
        }

        ++fast;
    }

    return slow;
}

时间复杂度:O(n)

空间复杂度:O(1)

到了这里,关于算法刷题Day1 二分查找+移除元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷题营【Day1】:: 27. 移除元素:快慢指针在顺序表中的应用与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:27. 移除元素 2. 题解参考 3. 题解思路 4. 相关题 [ - - 4.1 26. 删除有序数组中的重复项 ] [ - - 4.1 283. 移动零 ] 5. 相关题题解及简要思路 - - 5.1 26. 删除有序数组中的重复项 - - 5.1 283. 移动

    2024年02月06日
    浏览(83)
  • 算法-二分查找、移除元素

    伪装成一个老手! 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 来源:力扣二分查找 1. Q1: 为

    2024年02月10日
    浏览(37)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(32)
  • 【代码随想录算法第一天| 704.二分查找 27.移除元素】

    题目链接:二分查找 文章讲解:代码随想录.二分查找 视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 二分前提:有序数组,数组中无重复元素 方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左

    2024年02月16日
    浏览(33)
  • 【算法刷题】—7.12二分查找应用,数组处理

    🧛‍♂️ 个人主页: 杯咖啡 💡进步是今天的活动,明天的保证! ✨目前正在学习:SSM框架,算法刷题 🙌 牛客网 ,刷算法过面试的神级网站, 用牛客你也牛。 👉免费注册和我一起学习刷题👈 🐳希望大家多多支持🥰一起进步呀! 😎Love is the one thing we’are capable of perc

    2023年04月08日
    浏览(55)
  • 二分查找结果总是不对?一文帮你解决二分查找的边界问题&&数组移除元素太耗时间,双指针法为你打开新世界的大门,降时间复杂度为O(n)

      可能有粗心写的不正确的地方,或者因为技术有限写得不好的地方,欢迎大家批评指正,文章中给出的代码是本人自己写的leetcode中的代码,是代码的核心部分,如果放到本地编译器中,可能要加入mian()函数等内容。 LeetCode704二分查找    二分查找的思路非常简单,也就

    2024年02月08日
    浏览(52)
  • 704.二分查找 27.移除元素

    LeetCode 704 二分查找 1.左闭右开   2.左闭右闭     思路: 一(左闭右开):因为是左闭右开的区间,rigth指针的位置为待查找数组的右边界下一个位置,所以当 left right 的状态代表我们的数组还没查尽。 二(左闭右闭):因为是左闭右闭的区间,rigth指针的位置为待查找数组

    2024年02月13日
    浏览(32)
  • Leetcode 704.二分查找、27.移除元素

    暴力循环: 自己的思路 从左往右,遍历每个元素。 检查当前元素是否满足要求。 若满足要求则返回当前元素的下标。 时间复杂度:O(n); 空间复杂度:O(n); 二分查找: 题目给定的是一个升序的数组,即有序数组! 那么二分的前提是有序(或者具有某种特殊的性质!)。

    2024年02月17日
    浏览(39)
  • # - LeetCode 704-二分查找 |LeetCode 27-移除元素

    ##  LeetCode 704-二分查找 -题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target , -写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  , 写一个函数搜索 nums

    2024年02月16日
    浏览(42)
  • 代码随想录Python:704. 二分查找,27. 移除元素

    数组是非常基础的数据结构。 数组是存放在连续内存空间上的相同类型数据的集合。 题目: 给定一个  n  个元素有序的(升序)整型数组  nums  和一个目标值  target   ,写一个函数搜索  nums  中的  target ,如果目标值存在返回下标,否则返回  -1 。 题目链接:. - 力扣

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包