算法刷题记录——LeetCode篇(3.9) [第281~290题](持续更新)
更新时间:2025-04-04
- 算法题解目录汇总:算法刷题记录——题解目录汇总
- 技术博客总目录:计算机技术系列博客——目录页
优先整理热门100及面试150,不定期持续更新,欢迎关注!
283. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
进阶:
你能尽量减少完成的操作次数吗?
方法一:双指针直接覆盖
- 双指针定位:使用快慢双指针
i
和j
,快指针i
遍历数组,慢指针j
指向下一个非零元素的存放位置。 - 非零元素处理:当
nums[i]
非零时,若i
和j
不重合,将nums[i]
覆盖到j
的位置,并将原位置i
置零。 - 移动指针:每次处理完非零元素后,慢指针
j
前移。
代码实现(Java):
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
if (i != j) { // 避免原地覆盖
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
}
}
复杂度分析:
- 时间复杂度:
O(n)
,只需一次遍历。 - 空间复杂度:
O(1)
,原地操作,无额外空间。
方法二:双指针交换
- 双指针遍历:快指针
i
遍历数组,慢指针j
标记非零区末尾。 - 交换非零元素:当
nums[i]
非零时,与nums[j]
交换,j
后移。 - 零元素处理:非零元素被交换到前面,零自然被挤到末尾。
代码实现(Java):
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
if (i != j) {
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
j++;
}
}
}
复杂度分析:
- 时间复杂度:
O(n)
,一次遍历。 - 空间复杂度:
O(1)
,原地交换。
声明
- 本文版权归
CSDN
用户Allen Wurlitzer
所有,遵循CC-BY-SA
协议发布,转载请注明出处。- 本文题目来源
力扣-LeetCode
,著作权归领扣网络
所有。商业转载请联系官方授权,非商业转载请注明出处。