要建一个优惠卷网站怎么做销售新品牌如何推广
web/
2025/9/27 0:20:06/
文章来源:
要建一个优惠卷网站怎么做,销售新品牌如何推广,网页构建器,如何在线制作印章题目描述 原题链接#xff1a;LeetCode 27. 移除元素给定一个数组 nums 和一个值 val#xff0c;你需要原地移除所有数值等于 val 的元素#xff0c;返回移除后数组的新长度。不要使用额外的数组空间#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成…题目描述 原题链接LeetCode 27. 移除元素给定一个数组 nums 和一个值 val你需要原地移除所有数值等于 val 的元素返回移除后数组的新长度。不要使用额外的数组空间你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums [3,2,2,3], val 3,函数应该返回新的长度 2, 并且 nums 的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。
示例 2:给定 nums [0,1,2,2,3,0,4,2], val 2,函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
说明:为什么返回数值是整数但输出的答案是数组呢?请注意输入数组是以“引用”方式传递的这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说不对实参作任何拷贝
int len removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i 0; i len; i) {print(nums[i]);
}
题意解读 划一下题目的重点原地移除不要使用额外的数组空间不需要考虑数组中超出新长度后面的元素题目要求我们原地删除所有等于 val 的元素不能使用额外空间且不用考虑删除后超出新数组长度后面的元素。也就是说如果原数组 nums 长度为 x要删除的 val 元素个数为 y那么我们只要把这 n 个要删除的元素所在位置用其他有效元素覆盖掉然后返回最终的数组长度 x - y。题目并非让我们真的删除数组的元素而是要改写相关元素的值。思路阐述 那么要如何进行元素的改写呢既然要让 val 元素都堆在数组尾部那么我们就派出一个开拓者探路只要遇到非 val 元素就把它覆盖到前面来。因此我们可以定义两个指针快指针 j用于寻找非 val 元素慢指针 i当 j 找到非 val 元素时就被非 val 元素覆盖图解思路 以题中的 nums [3,2,2,3], val 3 为例。开始时 i 和 j 都指向下标 0 位置此时 j 指向的元素为 val所以把 j 右移动 1 位此时开拓者 j 找到了一个非 val 元素那么就赋值给 i 吧赋值以后我们得到了一个新的序列 [2, 2, 2, 3]我们可以得知i 指向的元素一定不是 val因为它是从 j 指向的元素赋值得来的j 指向非 val 元素才会进行赋值j 指向的元素一定不是非 val这样一来i 和 j 都完成了本轮使命继续前进因此每次交换以后我们都同步增长双指针令 i i 1j j 1此时 j 又指向了一个非 val 元素继续赋值因为本次 i 与 j 指向元素相同所以赋值后序列没有改变。赋值操作后我们继续同步增长双指针此时 j 指向了一个 val 元素无法进行赋值操作继续增长 j令 j j 1此时我们发现 j 超出数组范围了循环结束。[2, 2, 2, 3] 即为我们最终所求结果而红色部分即为新数组长度长度为 len(nums) - (j - i)。总结一下 设置双指针 i 和 j其中j 用于寻找非 val 元素来覆盖 i 所指向的元素。 初始时设 i 0, j 0遍历数组若 nums[j] ! val把 j 的值赋给 inums[i] nums[j]同步增长双指针i i 1, j j 1若 nums[j] valj 变为快指针j j 1寻找下一个非 val 元素具体实现 Pythonclass Solution:def removeElement(self, nums, val)::type nums: List[int]:type val: int:rtype: intlength len(nums)i 0j 0while j length:if nums[j] ! val:nums[i] nums[j]i i 1j j 1else:j j 1res length - (j - i)return res
Golangfunc removeElement(nums []int, val int) int {length : len(nums)if length 0 {return 0}i : 0j : 0for j length {if nums[j] val {// 去找一个不是 val 的值j} else {// 赋值nums[i] nums[j]i j}}return length - (j - i)
}
复杂度 时间复杂度O(n)空间复杂度O(1)没有使用到额外空间。 我的题解项目: https://github.com/JalanJiang/leetcode-notebook如果你对做题和分享题解感兴趣欢迎加入 LeetCode 刷题小分队https://github.com/leetcode-notebook/leetcode-notebook.github.io/blob/master/README.md如果你觉得文章写得不错欢迎关注公众号「编程拯救世界」公众号专注于编程基础与服务端研发定期分享算法与数据结构干货~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81348.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!