学习目标:
- 掌握几种基本的算法结构,实现算法问题解决的基本思维
- 最近加班,时间紧张,周末两天补一下欠账
学习内容:
给你一个数组 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 的值就是输出数组的长度, 这样就得到了我们最终需要的结果.
学习产出:
- CSDN 技术笔记 1遍
- CSDN
- leetcode 题目闭环 1个
- . - 力扣(LeetCode)