当前位置: 首页 > news >正文

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;  // 记录删掉了几个0for(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);}}
};

运行结果:

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

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++;}}
};

 它的思路:

 

 

 

http://www.lryc.cn/news/131036.html

相关文章:

  • GuLi商城-前端基础Vue-生命周期和钩子函数
  • 输入输出+暴力模拟入门:魔法之树、染色の树、矩阵、字母加密、玫瑰鸭
  • ​Kubernetes的演变:从etcd到分布式SQL的过渡
  • 29、简单通过git把项目远程提交到gitee
  • 元宇宙之应用(04)沉浸式游戏
  • 浙大数据结构第八周之08-图7 公路村村通
  • SpringBoot 解决跨域问题
  • 2023 年牛客多校第十场题解
  • 韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑
  • WebRTC | SDP详解
  • Springboot 实践(9)springboot集成Oauth2.0授权包,5个接口文件配置详解
  • 最新AI系统ChatGPT程序源码/支持GPT4/自定义训练知识库/GPT联网/支持ai绘画(Midjourney)+Dall-E2绘画/支持MJ以图生图
  • 【高频面试题】 消息中间件
  • 物联网智慧安防实训综合实训基地建设方案
  • openGauss学习笔记-44 openGauss 高级数据管理-存储过程
  • 【Linux】进程信号篇Ⅲ:可重入函数、volatile关键字、SIGCHLD信号
  • 排序算法:冒泡排序
  • Spring事件监听源码解析
  • Cpp学习——list的模拟实现
  • 工具推荐:Chat2DB一款开源免费的多数据库客户端工具
  • C语言刷题指南(二)
  • [C++11]
  • 【MySQL系列】--初识数据库
  • Unity导入google.protobuf失败,无法找到google命名空间
  • 使用IDM下载视频出现“由于法律原因,IDM无法下载...
  • pointnet C++推理部署--tensorrt框架
  • 34.Netty源码之Netty如何处理网络请求
  • vscode 安装勾选项解释
  • Spring 6.0官方文档示例(24): replace-method的用法
  • 自然语言处理从入门到应用——LangChain:记忆(Memory)-[聊天消息记录]