ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

LeetCode 热题 100——day3 最长连续序列

LeetCode 热题 100——day3 最长连续序列 ✨ 把代码写进星轨用逻辑丈量宇宙。导航链接个人主页 星轨初途基础语言专栏 C语言、 数据结构刷题实战专栏 算法及编程题分享、 力扣每日刷题分享 刷题打卡继续今天来解决一道看似简单但很适合练习双指针思想的题目——移动零。准备好了吗让我们开始吧文章目录移动零题目思路方法双指针 交换复杂度分析为什么不会改变非零元素的顺序总结移动零题目思路题目要求将数组中的所有0移动到末尾同时保持非零元素原来的相对顺序。例如输入[0,1,0,3,12] 输出[1,3,12,0,0]同时题目还要求必须原地修改数组不能复制额外数组尽量减少操作次数。因此可以使用双指针完成。方法双指针 交换使用两个变量i遍历数组中的每一个元素 cur记录最后一个非零元素所在的位置cur初始为-1。当nums[i]不等于0时将它与cur 1位置的元素交换然后让cur向后移动。swap(nums[i],nums[cur1]);cur;这样可以保证所有非零元素依次移动到数组前面非零元素的相对顺序不会改变被交换出去的0会逐渐移动到数组末尾。例如nums [0,1,0,3,12]执行过程遇到 1[1,0,0,3,12] 遇到 3[1,3,0,0,12] 遇到 12[1,3,12,0,0]最终结果为[1,3,12,0,0]复杂度分析时间复杂度O(n)空间复杂度O(1)。数组只需要遍历一次并且没有使用额外数组。代码classSolution{public:voidmoveZeroes(vectorintnums){// i 遍历数组cur 记录最后一个非零元素的位置for(inti0,cur-1;inums.size();i){// 当前元素不为 0if(nums[i]){// 将非零元素移动到前面swap(nums[i],nums[cur1]);cur;}}}};为什么不会改变非零元素的顺序我们按照从左到右的顺序遍历数组。每遇到一个非零元素就将它放到下一个应该存放非零元素的位置因此非零元素被移动后的顺序与原数组中的顺序完全一致。例如原顺序1、3、12 移动后1、3、12所以该方法既能把所有0移到末尾也能保证非零元素的相对顺序不变。总结方法核心思路时间复杂度空间复杂度双指针 交换将非零元素依次交换到数组前面O(n)O(1)这道题的重点就是维护一个指针表示下一个非零元素应该放置的位置。代码虽然不长但双指针的思想非常实用在数组移动、删除元素和原地修改等问题中经常会遇到。 今天的题目就顺利拿下啦我们下一题继续出发
返回列表