徐州公司网站建设代理网络阅卷
2026/1/12 4:17:37 网站建设 项目流程
徐州公司网站建设,代理网络阅卷,建网站培训学校,人力管理系统一、方法一#xff1a;把nums当作栈。用一个栈记录非零元素。1.思路#xff1a;#xff08;1#xff09;以示例1为例#xff0c;nums [0,1,0,3,12]#xff0c;判断过程如下表所示。#xff08;2#xff09;最后#xff0c;再在栈的末尾添加两个零#xff0c;即为答案…一、方法一把nums当作栈。用一个栈记录非零元素。1.思路1以示例1为例nums [0,1,0,3,12]判断过程如下表所示。2最后再在栈的末尾添加两个零即为答案[1,3,12,0,0]。3为了做到O(1)的空间复杂度可以直接把nums当作栈用一个变量StackSize表示栈的大小初始值为0。4入栈就是把nums[StackSize]置为nums[i]同时把StackSize加1。5最后把nums中的下标从StackSize到n - 1的数都置为0。2.复杂度分析1时间复杂度O(n)其中n是nums的长度。2空间复杂度O(1)。附代码class Solution { public void moveZeroes(int[] nums) { int stackSize 0; for(int x : nums){ if(x ! 0){ //先赋值再加1 nums[stackSize] x; } } //Arrays.fill是前闭后开区间 //从索引stackSize开始包含到索引nums.length结束不包含将元素置为0 Arrays.fill(nums,stackSize,nums.length,0); } }二、方法二双指针 交换元素。1.优势方法一在最坏的情况下nums全为0需要遍历nums两次而本方法只需要一次遍历。2.核心思路1把0视作空位把所有非0元素移动到数组左边的空位上并保证非0元素的顺序不变。2举例如nums [0,0,1,2]把1放到最左边的空位上数组就变成了[1,0,0,2]。注意1移动过去后在原来1的位置又产生了一个新的空位。也就是说交换了nums[0] 0和nums[2] 1这两个数。3为了保证非0元素的顺序不变需要维护最左边的空位的位置即下标。3.具体思路1从左到右遍历nums[i]。2同时维护另一个下标i0初始值为0并保证下标区间[i0,i - 1]都是空位且i0指向最左边的空位。3每次遇到nums[i] ! 0的情况就把nums[i]移动到最左边的空位上也就是交换nums[i]和nums[i0]。交换后把i0和i都加1从而使【[i0,i - 1]都是空位】这一性质仍然成立。4如果nums[i] 0无需交换只把i加1。4.举例示例1的nums [0,1,0,3,12]计算过程如下所示下划线表示交换的两个数5.由于每次操作后[i0,i - 1]对应的元素值全为0这一性质始终成立所以nums遍历结束后i n[i0,n - 1]对应的元素值全为0且[0i0 - 1]都是交换过去的非0元素这样就满足了题目“将所有的0移动到数组的末尾”的要求。6.复杂度分析1时间复杂度O(n)其中n是nums的长度。2空间复杂度O(1)。附代码class Solution { public void moveZeroes(int[] nums) { int i0 0; for(int i 0;i nums.length;i){ //i用来找第一个非0元素并与i0交换位置 //如果i指向的元素为0i继续向后找 //如果i指向的元素非0i指向的元素就会和i0交换然后i0,因此i0左边的元素都是非0元素 //i0指向下一个非0元素应该存放的位置i0左边的元素都是已经整理好的非0元素i0和i之间的元素都是0 if(nums[i] ! 0){ //交换nums[i]和nums[i0] int tmp nums[i]; nums[i] nums[i0]; nums[i0] tmp; i0; } } } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询