刷题笔记:力扣第283题-移动零

1.一道简单的双指针题目,初步想法为设置两个快慢指针,快指针遍历一遍数组,将非0元素放到慢指针处,之后慢指针遍历剩余元素并全部填充为0即可。完整代码如下:

 1. void moveZeroes(int* nums, int numsSize) {
 2.     // l:慢指针,记录非零元素待存放位置;r:快指针,遍历整个数组
 3.     int l = 0, r = 0;
 4.     // 快指针遍历所有元素
 5.     while (r < numsSize){
 6.         // 当前遍历到非零数字,存入慢指针位置,慢指针后移
 7.         if (nums[r] != 0){
 8.             nums[l++] = nums[r];
 9.         }
10.         // 快指针持续右移
11.         r++;
12.     }
13.     
14.     // 慢指针之后剩余位置全部填充0
15.     while (l < numsSize) nums[l++] = 0;
16.  
17.     return;
18. }

该算法时间复杂度为O(n),空间复杂度为O(1)。

2.还可以让快指针一直后移,找到第一个非零数后与慢指针交换,这样能保证快指针和慢指针之间全是0,最后它们能被顺利运动到数组末尾。完整代码如下:

 1. // 交换两个整型变量的值
 2. void swap(int* a, int* b){
 3.     int tmp = *a;
 4.     *a = *b;
 5.     *b = tmp;
 6. }
 7.  
 8. void moveZeroes(int* nums, int numsSize) {
 9.     // l:记录下一个非零数字要放置的下标;r:遍历数组的快指针
10.     int l = 0, r = 0;
11.     // 快指针逐个遍历数组所有元素
12.     while (r < numsSize){
13.         // 找到非0元素,和l位置元素交换,交换后l向后移动一位
14.         if (nums[r]){
15.             swap(&nums[l++], &nums[r]);
16.         }
17.         // 快指针持续右移
18.         r++;
19.     }
20.  
21.     return;
22. }

该算法时间复杂度为O(n),空间复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值