进阶计划_算法思维_挑战100天_DAY3_补

本文介绍了如何使用双指针技巧解决LeetCode中的原地移除数组中等于给定值的元素问题,重点讲解了双指针策略和如何在O(1)空间复杂度下实现。作者还分享了Python中利用内置函数的解决方案。
摘要由CSDN通过智能技术生成

 学习目标:

  • 掌握几种基本的算法结构,实现算法问题解决的基本思维
  • 最近加班,时间紧张,周末两天补一下欠账

学习内容:

题目:.. - 力扣(LeetCode)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 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],也会被视作正确答案。

题解明细:

思路:(暴力解法)双层for循环遍历所有字符子串,然后判断该子串是否为回文子串


学习笔记:

1、我想到思路是:一个remove就OK 了。哈哈直接用Python强大的自带的函数能力就可以啊

2、在参考了各位大神的经验,实际上本题是考察我们移除元素的双指针思想,所有需要我们去用双指针思想去解决此类问题。

动态规划:

(1)个人理解:

双指针是通过交换,一个在头部,一个在尾部,把删除的换到最后一个, 并且在遍历的时候减一,就可以把val删除出去(也就是遍历的时候遍历不到),如果最后一个交换的那个数字和要交换的相同,没关系, 有right--操作,这样减完首尾交换的数字就不同了

(2)专业讲解:

本题最重要的限制条件就是 原地移除元素, 使用O(1)的额外空间. 如果没有这个条件限制, 那么本题是非常简单的, 我们只需要遍历一遍, 将所有满足的元素放到另一个数组就完成操作了. 这样就会使用到O(n)的空间复杂度.

因为限制条件的存在, 我们必须寻找其他的思想, 只能在原数组上进行操作, 这样才能满足O(1)的空间复杂度. 这样我们就不光需要找到满足的元素, 还要同时找到满足的元素需要存放的位置, 所以我们就需要使用 双指针 来同时确定这两个位置.

这就回到了导图中使用的思想: 右指针right指向当前将要处理的元素, 左指针left指向下一个将要赋值的位置, 这是两个指针的作用说明. 下面就是两种实际遍历中会出现的情况了.

如果右指针指向的元素不等于 val, 它一定是输出数组的一个元素, 我们就将右指针指向的元素复制到左指针位置, 然后将左右指针同时右移

如果右指针指向的元素等于 val, 它不能在输出数组里, 此时左指针不动, 右指针右移一位

在 双指针 进行不断遍历的过程中, 我们要从变化中寻找 不变的性质: 区间[0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后, left 的值就是输出数组的长度, 这样就得到了我们最终需要的结果.

学习产出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值