LeetCode 第283题要求将数组中的所有零移动到数组的末尾,同时保持非零元素的相对顺序。
给定一个数组 nums
,编写一个函数将所有的 0
移动到数组的末尾,同时保持非零元素的相对顺序。
注意:
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0,0,1]
输出: [1,0,0]
双指针法:
i
和 j
。i
指向非零元素要存储的位置,j
遍历整个数组寻找非零元素。i
的位置,并将 i
向后移动。i
开始的剩余位置填充为零。遍历两次:
复杂度分析:
以下是基于双指针的代码实现:
#include
/**
* 移动零
* @param nums: 输入数组
* @param numsSize: 数组的大小
*/
void moveZeroes(int* nums, int numsSize) {
int i = 0; // i 指向非零元素要存储的位置
for (int j = 0; j < numsSize; j++) {
if (nums[j] != 0) { // 如果找到非零元素
nums[i] = nums[j]; // 将非零元素移动到索引 i 的位置
i++; // 更新 i 的位置
}
}
for (; i < numsSize; i++) {
nums[i] = 0; // 将剩余的位置填充为 0
}
}
int main() {
int nums1[] = {0, 1, 0, 3, 12};
int nums2[] = {0, 0, 1};
moveZeroes(nums1, 5);
moveZeroes(nums2, 3);
printf("Test Case 1: ");
for (int i = 0; i < 5; i++) {
printf("%d ", nums1[i]);
}
printf("\n");
printf("Test Case 2: ");
for (int i = 0; i < 3; i++) {
printf("%d ", nums2[i]);
}
printf("\n");
return 0;
}
moveZeroes
void moveZeroes(int* nums, int numsSize) {
int i = 0; // i 指向非零元素要存储的位置
i
,用于记录非零元素存储的目标位置,初始值为 0。 for (int j = 0; j < numsSize; j++) {
if (nums[j] != 0) { // 如果找到非零元素
nums[i] = nums[j]; // 将非零元素移动到索引 i 的位置
i++; // 更新 i 的位置
}
}
j
遍历数组:
nums[j] != 0
,说明当前元素是非零,将其移动到 nums[i]
。i
向后移动,以便存储下一个非零元素。 for (; i < numsSize; i++) {
nums[i] = 0; // 将剩余的位置填充为 0
}
i
指向非零元素的最后一个位置。i
开始,将数组剩余的所有位置填充为 0
。main
int main() {
int nums1[] = {0, 1, 0, 3, 12};
int nums2[] = {0, 0, 1};
moveZeroes(nums1, 5);
moveZeroes(nums2, 3);
printf("Test Case 1: ");
for (int i = 0; i < 5; i++) {
printf("%d ", nums1[i]);
}
printf("\n");
printf("Test Case 2: ");
for (int i = 0; i < 3; i++) {
printf("%d ", nums2[i]);
}
printf("\n");
return 0;
}
nums1 = {0, 1, 0, 3, 12}
nums2 = {0, 0, 1}
moveZeroes
函数进行操作。运行代码后输出:
Test Case 1: 1 3 12 0 0
Test Case 2: 1 0 0
时间复杂度:
空间复杂度: