代码随想录Day1 | 数组01- leetcode 704、27

这篇具有很好参考价值的文章主要介绍了代码随想录Day1 | 数组01- leetcode 704、27。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

704-二分法

题目链接:二分查找

关键问题:

        - 边界(left、right)、当前查找值(middle)

                - target大于当前查找值 --> 当前查找区域的右边,更改区间left

                - target小于当前查找值 --> 当前查找区域的左边,更改区间right

                - middle的计算 :(right - left)/2  + left 

        - 查找区间

                - 开区间or闭区间 --> 涉及while的判断条件即target不存在的情况

时空复杂度:

        - 时间复杂度:数组长度为n,查找区间的长度:n、n/2、n/4、n/8、...、n/2^k  --> O(log n)

        - 空间复杂度:O(1)

代码
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 - left)/2);
            if(nums[middle] == target){
                return middle;
            } else if(nums[middle] > target){
                right = middle - 1;
            } else{
                left = middle + 1;
            }
        }

        return -1;
    }
};

        一些可以提升性能的细节:在三个if判断中,将查找到结果放在最前(代码第9-10行) --> 若当前命中则可以减少两次判断


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; j < n-1; j++){
                    nums[j] = nums[j+1];
                }
                i--;
                n--;
            }
        }
        return n;
    }
};

        代码细节 (i--): 由于发生了前移,当前位置i发生了元素的替换,而i在循环中自增,因此需要i--,回到位置i处。

        时间复杂度:

2.快慢指针

        算法描述:双指针法,快慢指针同时从头遍历,遇到待移除元素时慢指针停止,快指针继续移动直到遇到第一个不需要移除的元素,此时将快指针指向的元素拷贝到慢指针指向的数组位置,拷贝完成后,快慢指针继续同步移动,直至快指针遍历完数组。

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];
            }
        }
        return slow;
    }
};

        时间复杂度:O(n)

3.相向双指针

        算法描述:双指针法,设置首尾指针,首指针开始遍历,当遇到待移除元素时停止,此时尾指针从后向前移动至不需要删除的元素位置处,将尾指针指向的元素拷贝到首指针指向的位置,尾指针前移一步。首指针继续遍历,遇到待移除元素重复上述操作,直至首位指针相遇。

        优点:与快慢指针对比来考虑,若遇到待删除元素在靠前位置时,快慢指针需要移动所有后续元素,而双向双指针只需要一次替换操作。举例来说:对于数组A[n] = [0,1,1,...,1,1,2],当需要删除元素0时,快慢指针需要移动0后续的所有元素,得到的结果为A[n-1] = [1,1,...,1,1,2],而相向双指针仅需一次替换将2替换到最前,得到的结果为A[n-1] = [2,1,1,...,1,1]。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 相向双指针
        int left = 0;
        int right = nums.size() -1;
        
        while(left <= right){// 闭区间
            if(nums[left] == val){
                if(nums[right] != val){
                    nums[left] = nums[right];
                    left++;
                }
                right--;
            }else{
                left++;
            }
        }
        return left;
    }
};

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

到了这里,关于代码随想录Day1 | 数组01- leetcode 704、27的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 代码随想录day01

    ● 思维不难,主要是考察对代码的掌控能力 ● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址 ● Java中的

    2024年02月13日
    浏览(51)
  • 代码随想录二刷day01

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 使用左闭右闭区间的二分查找时, 最后low一定是被查找元素的插入位置,若查找的数带小数,low-1, 便是最终结果 1、左闭右闭 2、左闭右开

    2024年02月12日
    浏览(48)
  • 代码随想录 day38 第九章 动态规划part01

    ●  理论基础 ●  509. 斐波那契数 ●  70. 爬楼梯 ●  746. 使用最小花费爬楼梯 理论基础 解决动态规划必须要想清楚的点 dp数组以及下标的含义 递推公式 dp数组如何初始化 遍历顺序 打印数组 检查结果 关联 leetcode 509. 斐波那契数 思路 动规五部曲 dp数组以及下标的含义

    2024年04月17日
    浏览(47)
  • 代码随想录 LeetCode数组篇 二分查找

    # (简单)704. 二分查找 题目链接 代码随想录 - 二分查找思路 二分查找,思路很简单,但是在while循环left和right的比较是写=还是,还有right=mid还是right=mid-1容易混淆 需要想清楚对区间的定义,是[left,right],还是[left,right) (版本一,左闭右闭版本) (版本二,左闭右开) 题目

    2024年02月02日
    浏览(50)
  • 【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享 ✨ 给你一个正整数 n ,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 示例 2: 提示: 思路: 本类型题目其实都不涉及什么算法,就是模拟

    2024年02月16日
    浏览(46)
  • 【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59-54

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享 ✨ 给你一个正整数 n ,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 示例 2: 提示: 思路: 本类型题目其实都不涉及什么算法,就是模拟

    2024年02月16日
    浏览(43)
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(50)
  • 【代码随想录-Leetcode第六题:209. 长度最小的子数组】

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 参考【代码随想录】 示例 1: 示例 3: 提示: 1 = target = 109 1 = nums.length

    2024年02月12日
    浏览(39)
  • 代码随想录day2|有序数组的平方、长度最小的子数组、螺旋矩阵

    前言:今天去校医院拔了两颗牙,太痛了,今天写的博客就比较水。 所谓滑动窗口,就是不断的调节 子序列的起始位置和终止位置 ,从而得出我们要想的结果。

    2024年02月01日
    浏览(46)
  • 代码随想录day21(2)二叉树:二叉树的所有路径(leetcode257)

    题目要求:按任意顺序返回所有从根节点到叶节点的路径 思路:我们先递归地进行前序遍历,同时要注意回溯的过程,注意一些库的用法即可。 leetcode实战: 代码实现:

    2024年03月18日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包