一、题目要求
二、解体思路
1.双指针法
思路:左指针代表0元素的起始位置,右指针代表数组的遍历位置;
在没有遇到0之前,左指针和右指针的位置是相同的,此时什么都不需要做;
在遇到0之后,左指针和右指针的位置不在相同,此时需要调换位置,即把右指针的值赋值给左指针,右指针改为0,同时左指针左移一位
代码如下:
public static void moveZeroes(int[] nums) {
int left = 0;
for (int right = 0;right<nums.length;right++) {
if(nums[right]!=0){
if(left!=right){
nums[left] =nums[right];
nums[right]=0;
}
left++;
}
}
}
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1)。只需要常数的空间存放若干变量
2.移除法
思路:第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j];
非0元素统计完了,剩下的都是0了,所以第二次遍历把末尾的元素都赋为0即可
代码:
public static void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
复杂度分析
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1),只需要常数的空间存放若干变量。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/130216.html