每日一题——移除元素

简介: 每日一题——移除元素

移除元素

题目链接

思路

  • 题目没有规定时间复杂度,那么我们最容易想到的方法肯定是利用两层for循环来解决问题
  • 即遍历数组,如果数组元素等于val,那就将这个元素后面的元素往前移,将这个值为val的元素覆盖
  • 这样的暴力解法的时间复杂度为O(n2)
  • 那这题可不可以缩短时间,使时间复杂度为O(n)呢?当然可以,这里我们就需要用到双指针中的快慢指针思想
  • 定义快指针fast,用来遍历整个数组,慢指针slow用来确定新数组(即删除值为val元素后·数组)的下标,并都初始化为0
  • 当nums[fast]不为val时,那就使nums[slow]的值为nums[fast],同时slow++,相当于保留数组元素
  • 当nums[fast]等于val时,那就使fast继续遍历,而slow不变,相当于删除了值为val的元素

实现代码

方法一

int removeElement(int* nums, int numsSize, int val){
    int i,j;
    for(i=0;i<numsSize;i++)
    {
        if(nums[i] == val)
        {
            for(j=i+1;j<numsSize;j++)
                nums[j-1] = nums[j];
            numsSize--; //数组大小减一
            i--;  //由于后面的元素往前覆盖了一个位置,因此i要向前走一个
        }
    }
    return numsSize;
}

方法二(快慢指针

int removeElement(int* nums, int numsSize, int val){
    int fast,slow = 0;
    for(fast = 0; fast < numsSize; fast++)
    {
        if(nums[fast] != val)
            nums[slow++] = nums[fast];
    }
    return slow;
}

ps:快慢指针的动态图来自《代码随想录》——https://programmercarl.com/


相关文章
|
11天前
|
索引
leetcode题解:27.移除元素
leetcode题解:27.移除元素
13 0
|
8月前
每日一题——leetcode基础题之移除链表元素
每日一题——leetcode基础题之移除链表元素
24 0
每日一题——leetcode基础题之移除链表元素
|
8月前
27.移除元素(LeetCode)
27.移除元素(LeetCode)
|
10月前
|
测试技术
每日一题(移除链表元素)
每日一题(移除链表元素)
leetcode:27.移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
45 0
|
算法
(leetcode)27. 移除元素
(leetcode)27. 移除元素
45 0
|
存储 索引
【LeetCode】每日一题:移除元素
【LeetCode】每日一题:移除元素
67 0
leetcode27.移除元素
leetcode27.移除元素
50 0
|
测试技术
Leetcode每日一题——“移除元素”
Leetcode每日一题——“移除元素”