【LeetCode】每日一题:移除元素

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

【LeetCode】每日一题:移除元素

目录

 题目:

思想1:暴力解法

思想2:创建一个temp数组 

思想3:双指针


👻内容专栏:《LeetCode刷题专栏》

🐨本文概括:27.移除元素

🐼本文作者:花 碟

🐸发布时间:2023.4.15

https://leetcode.cn/problems/remove-element/   点击跳转到LeetCode平台OJ页面(27.移除元素)

 题目:

【LeetCode】每日一题:移除元素

 👉 示例1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

 👉 示例2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]

解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思想1:暴力解法

解题思路:
        1. 从前往后遍历nums,找到val第一次出现的位置
        2. 将val之后的所有元素整体往前搬移,即删除该val
        3. nums中有效元素个数减少一个

时间复杂度:O(n²)    空间复杂度:O(1)

代码实现:

int removeElement(int* nums, int numsSize, int val){
     
    int i = 0;
    for(i = 0;i < numsSize;i++)
    {
         if(nums[i] == val)
         {
             int j = 0;
            for(j = i + 1;j < numsSize;j++)
            {
                 nums[j - 1] = nums[j];
            }
             numsSize--;//等于val的元素被覆盖掉了,数组元素就减去1
             i--;//下标i以后的数值向前移动了一位,所以i需要回到原来的位置继续寻找
         }
     }
     return numsSize;
}

思想2:创建一个temp数组 

解题思路:
        1. 创建一个长度与nums相同的数组temp
        2. 遍历nums,将nums中所有与val不同的元素搬移到temp中
        3. 将temp中所有元素拷贝回nums中

时间复杂度:O(n)    空间复杂度:O(n)

 代码实现:

int removeElement(int* nums, int numsSize, int val) {
    // 1. 申请numSize个元素的新空间
    int* temp = (int*)malloc(sizeof(int) * numsSize);
    if (NULL == temp)
    {
        return 0;
    }

    // 2. 将nums中非val的元素搬移到temp中---尾插到temp中
    int count = 0;
    for (int i = 0; i < numsSize; ++i)
    {
        if (nums[i] != val)
        {
            temp[count] = nums[i];
            ++count;
        }
    }

    // 3. 将temp中删除val之后的所有元素拷贝到nums中
    memcpy(nums, temp, sizeof(int) * count);
    free(temp);
    //temp = NULL;
    return count;
}

思想3:双指针

解题思路:

双指针的方法只需要一个循环即可解决,时间复杂度为 O(n) 。

先定义一个fast快指针(用于寻找不同于val的元素和一个slow慢指针(用于存储更新的值;

说明:1.这里的快慢指针本质想象为利用索引下标访问数组。

           2.该题条件是快指针在小于所有元素的情况下进行查找。

快指针用于寻找不等于val的元素,当遇到不等于val的值时,快指针将此时指向的值赋值给慢指针此时指向的值,随后两个指针继续向后挪动,快指针当遇到等于val的值时,快指针直接跳过此值继续寻找,慢指针此时不动。最后只需输出慢指针的索引即可。

时间复杂度:O(n)    空间复杂度:O(1)

代码实现:

int removeElement(int* nums, int numsSize, int val){

     int slow = 0;
     int fast = 0;
     while(fast < numsSize)
     {
         if(nums[fast] != val)
         {
             nums[slow++] = nums[fast++];
         }
         else
                fast++;
     }
    return slow; 
}

🤗🤗 好啦,本篇文章就到此为止啦~ 感谢大家的支持!希望对你有帮助,如有什么疑问,可以在评论区or私信告诉我~~ 🥰🥰😉 文章来源地址https://www.toymoban.com/news/detail-418455.html

到了这里,关于【LeetCode】每日一题:移除元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【每日一题】移除链表元素(C语言)

    移除链表元素,链接奉上 在 正常 情况: 下我们移除链表元素时,需要该位置的 前结点与后节点 , 在 特别 情况时: 例如 我们发现,需要改变头结点,否则因为返回的 head 因为指向的位置被 free ,会导致程序错误 我们调试时可以在VS或其他的软件进行调试,也不用专门搞

    2024年02月05日
    浏览(44)
  • C语言每日一题:6.移除元素+合并两个有序数组。

    一:暴力查找的方法: 1.找到对应val值的下标,返回数组的下标。 2.删除对应的下标,从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了(注意数组越界的问题)。 3.删除了一个数之后数组元素个数要–。 4.查找和删除是在一个循环里面因为val的值可能

    2024年02月15日
    浏览(33)
  • Leetcode-每日一题【2487.从链表中移除节点】

    给你一个链表的头节点 head 。 对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。 返回修改后链表的头节点 head 。 示例 1: 输入: head = [5,2,13,3,8] 输出: [13,8] 解释: 需要移除的节点是 5 ,2 和 3 。 - 节点 13 在节点 5 右侧。 - 节点 13 在

    2024年02月16日
    浏览(35)
  • 每日一题——LeetCode1299.将每个元素替换为右侧最大元素

    方法一 个人方法:  题目意思就是求在i=1;i++的循环条件下,arr[i]-arr[arr.length-1]的最大值分别为多少,最后一项默认为-1 用slice方法可以每次把数组第一位去除,得到求最大值的目标数组 Math的max方法可以直接返回数组里的最大值 但是不能每次循环都求一遍目标数组的最大值,

    2024年01月23日
    浏览(46)
  • 【LeetCode每日一题】——1572.矩阵对角线元素的和

    矩阵 简单 1572.矩阵对角线元素的和 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat = [[1,2,3],                      [4,5,6],                      [7,

    2024年02月14日
    浏览(34)
  • 每日一题leetcode--使循环数组所有元素相等的最少秒数

    相当于扩散,每个数可以一次可以扩散到左右让其一样,问最少多少次可以让整个数组都变成一样的数 使用枚举,先将所有信息存到hash表中,然后逐一进行枚举,计算时间长短用看下图  考虑到环形数组,可以把首项+n放到最后,这样for循环就相当于前后可以联通 贴一张别

    2024年02月12日
    浏览(40)
  • 每日一题——LeetCode1287.有序数组中出现次数超过25%的元素

    方法一 一次循环统计 题目给出的数据相同的元素都是相邻的,那么直接从头开始遍历,统计每种元素出现次数,当有元素次数超过arr.length/4即为要求的元素   消耗时间和内存情况: 方法二 方法一简化版 设步长step=arr.length/4,如果某个元素arr[i],跨越一个步长后arr[i+step],即

    2024年01月22日
    浏览(41)
  • (单调栈) 496. 下一个更大元素 I——【Leetcode每日一题】

    难度:简单 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中 nums1 是 nums2 的子集。 对于每个 0 = i nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums

    2024年02月08日
    浏览(31)
  • ( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】

    难度:中等 给你一个 n x n n x n n x n 矩阵 m a t r i x matrix ma t r i x ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O ( n 2 ) O(n^2) O ( n 2 ) 的解决方案。 示例 1:

    2024年02月14日
    浏览(42)
  • 【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转

    ========================================================================= 个人主页直达: 小白不是程序媛 LeetCode系列专栏: LeetCode刷题掉发记 ========================================================================= 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数

    2024年02月08日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包