每日一题(算法学习者必刷系列)

本文介绍了如何使用双指针技巧解决LeetCode题目,要求在O(1)空间复杂度下移除数组中所有等于给定值的元素。通过两个指针begin和tail,将不等于val的元素移到数组前面,最后返回有效元素的数量。
摘要由CSDN通过智能技术生成

1.移除元素

链接:

https://leetcode.cn/problems/remove-elementicon-default.png?t=N7T8https://leetcode.cn/problems/remove-element

题目解读:通过题目我们可以获取到一个数组nums以及其大小numsSize还给定另一个值val,题目的要求是将数组中等于val的值全部删除,同时题目还要求空间复杂度为O(1),也就是不允许再创建数组,这就是题目的大概意思。

解题思路:这里我们可以采用双指针的思路来解决,但是这里要进行修改的是数组中的值,我们可以用两个下标(begin,tail)来代替,最初,我们可以让begin和tail都等于0,由于我们不用考虑超过数组大小的值,然后让tail去遍历整个数组如果nums[tail]!=val,我们就让nums[begin]=nums[tail];同时让begin++ tail++因为原begin的位置已经存放另一个不等于val的数,所以begin也要自加,当tail==numsSize表明数组的访问越界了这时要停止循环,可设置循环条件为tail<numsSize;如果nums[tail]==val 就只让tail++ 总之就是让不等于val的值放在数组的前面,超过数组长度的值直接忽略,此外由于我们每让nums[begin]=nums[tail] begin从0开始自加,所以begin可以看做删除后数组的大小。

图示:

代码展示:

int removeElement(int* nums, int numsSize, int val) {
    int begin,tail ;
    begin=tail=0;
    while(tail<numsSize)
    {
        if(nums[tail]!=val)
        {
            nums[begin++]=nums[tail];
        }
        tail++;
    }
    return begin;
}

希望你在努力学习的同时,也不要忘记刷题,加油少年!

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值