leetcode283. 移动零

这篇具有很好参考价值的文章主要介绍了leetcode283. 移动零。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

难度:简单题

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

思路:

一开始想,从前往后遍历,遇到0就挪到最后。类似于冒泡的思想,但是这样做的话时间复杂度可能是 三次方。

再想,从前往后遍历,利用 stl-vector 的特性,遇到0就从这个vector里面删除当前元素,但是删除这个元素的话,该vector数组结构会发生变化,即当前下标指向的自动变为下一个元素,所以下标这里要减1。

代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        // 要保持非零元素的相对顺序,不能排序!
        // 依次遍历,遇到0元素,则用冒泡排序的思想挪到最后 时间复杂度 三次方??
        // 思路,依次遍历,如果遇到0,则从vector中删掉该元素,并记录删了几个,最后添上去
        // 遍历时删元素会不会使数组下标发生变化?会使数组结构发生变化!
        int i = 0;
        int n = 0;  // 记录删掉了几个0
        for(i = 0; i < nums.size(); i++){
            if(nums[i] == 0){
                nums.erase(nums.begin()+i);
                n++;
                i--;    // 删掉当前元素,数组会立即发生变化!
            }
        }
        // 删了几个元素,后面补几个0        
        for(i = 0; i < n; i++){
            nums.push_back(0);
        }
    }
};

运行结果:

leetcode283. 移动零,LeetCode,算法

好吧,看了一下官方双指针代码,它的效果要好一点。。

leetcode283. 移动零,LeetCode,算法

leetcode283. 移动零,LeetCode,算法

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int left = 0, right = 0;
        int n = nums.size();
        while(right < n){
            if(nums[right]){
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};

 它的思路:

leetcode283. 移动零,LeetCode,算法

 文章来源地址https://www.toymoban.com/news/detail-658107.html

 

 

到了这里,关于leetcode283. 移动零的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode283.移动零

     这道题还是很简单的,我用的是双指针,左指针i从头开始遍历数组,右指针j是从i后面第一个数开始遍历,当左指针i等于0的时候,右指针j去寻找i右边第一个为0的数和i交换位置,交换完了就break内层循环,i往后移1位,j又从i的下一位开始,如果i不等于0,就不用进内层循环

    2024年02月12日
    浏览(34)
  • 【每日一题】Leetcode - 283. 移动零

    Leetcode - 283. 移动零 从右向左遍历,遇到0,就将后面所有元素前移,同时更新长度,使其减1,因为移动n次,倒数n位就被0占据,后续操作可忽略 前面的操作,从右向左,每次遇到0移动都要跑半个数组,慢在整体前移; 换个思路,从左向右,记录首个0的位置,将后面的第一

    2024年02月11日
    浏览(36)
  • [LeetCode]-283. 移动零-1089. 复写零

    目录 283. 移动零 描述  解析 代码 1089. 复写零 描述 解析 代码 283. 移动零 https://leetcode.cn/problems/move-zeroes/ 给定一个数组  nums ,编写一个函数将所有  0  移动到数组的末尾,同时保持非零元素的相对顺序。 请注意  ,必须在不复制数组的情况下原地对数组进行操作。 示例

    2024年02月05日
    浏览(31)
  • [双指针](一) Leetcode 283.移动零和1089.复写零

    [双指针] Leetcode 283.移动零和1089.复写零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组,将数组中的 所有0移动到数组的末尾 (2) 保证非0元素在数组中 相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容(也就是交换两个数的位置),所以我们很容易

    2024年02月08日
    浏览(30)
  • 移动零——力扣283

    题目描述 双指针

    2024年02月15日
    浏览(27)
  • leetcode:移动零

    easy 给定一个数组 nums ,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 示例 2: 提示 : 1 = nums.length = 104 -231 = nums[i] = 231 - 1 **进阶:**你能尽量减少完成的操作次数吗? 法1:操作次

    2024年02月12日
    浏览(31)
  • LeetCode——矩阵中移动的最大次数

    目录 1、题目  2、题目解读  3、代码 2684. 矩阵中移动的最大次数 - 力扣(Leetcode) 给你一个下标从  0  开始、大小为  m x n  的矩阵  grid  ,矩阵由若干  正  整数组成。 你可以从矩阵 第一列 中的  任一  单元格出发,按以下方式遍历  grid  : 从单元格  (row, col)  可以

    2024年02月06日
    浏览(25)
  • 【LeetCode: 2684. 矩阵中移动的最大次数 + dfs】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年03月19日
    浏览(34)
  • Leetcode每日一题:2337. 移动片段得到字符串(2023.8.21 C++)

    目录 2337. 移动片段得到字符串 题目描述: 实现代码与解析: 双指针 原理思路:         给你两个字符串  start  和  target  ,长度均为  n  。每个字符串  仅  由字符  \\\'L\\\' 、 \\\'R\\\'  和  \\\'_\\\'  组成,其中: 字符  \\\'L\\\'  和  \\\'R\\\'  表示片段,其中片段  \\\'L\\\'  只有在其左侧直接

    2024年02月11日
    浏览(28)
  • LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

    题目链接:343. 整数拆分 题目描述: 给定一个正整数  n  ,将其拆分为  k  个  正整数  的和(  k = 2  ),并使这些整数的乘积最大化。 返回  你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 算法分析: 定义dp数组及下标含义: dp[i]表述正整数i拆分成k个正整数

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包