43
43
44
44
<!-- 这里可写通用的实现逻辑 -->
45
45
46
+ ** 方法一:双指针**
47
+
48
+ 我们使用两个指针 $i$ 和 $j$,其中指针 $i$ 指向当前已经处理好的序列的尾部,而指针 $j$ 指向待处理序列的头部。初始时 $i=-1$。
49
+
50
+ 接下来,我们遍历 $j \in [ 0,n)$,如果 $nums[ j] \neq 0$,那么我们就将指针 $i$ 指向的下一个数与 $nums[ j] $ 交换,同时将 $i$ 后移。继续遍历,直至 $j$ 到达数组的尾部,该数组的所有非零元素就按照原有顺序被移动到数组的头部,而所有零元素都被移动到了数组的尾部。
51
+
52
+ 时间复杂度 $O(n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。
53
+
46
54
<!-- tabs:start -->
47
55
48
56
### ** Python3**
52
60
``` python
53
61
class Solution :
54
62
def moveZeroes (self , nums : List[int ]) -> None :
55
- """
56
- Do not return anything, modify nums in-place instead.
57
- """
58
- left, n = 0 , len (nums)
59
- for right in range (n):
60
- if nums[right] != 0 :
61
- nums[left], nums[right] = nums[right], nums[left]
62
- left += 1
63
+ i = - 1
64
+ for j, x in enumerate (nums):
65
+ if x:
66
+ i += 1
67
+ nums[i], nums[j] = nums[j], nums[i]
63
68
```
64
69
65
70
### ** Java**
@@ -69,13 +74,12 @@ class Solution:
69
74
``` java
70
75
class Solution {
71
76
public void moveZeroes (int [] nums ) {
72
- int left = 0 , n = nums. length;
73
- for (int right = 0 ; right < n; ++ right) {
74
- if (nums[right] != 0 ) {
75
- int t = nums[left];
76
- nums[left] = nums[right];
77
- nums[right] = t;
78
- ++ left;
77
+ int i = - 1 , n = nums. length;
78
+ for (int j = 0 ; j < n; ++ j) {
79
+ if (nums[j] != 0 ) {
80
+ int t = nums[++ i];
81
+ nums[i] = nums[j];
82
+ nums[j] = t;
79
83
}
80
84
}
81
85
}
@@ -88,11 +92,10 @@ class Solution {
88
92
class Solution {
89
93
public:
90
94
void moveZeroes(vector<int >& nums) {
91
- int left = 0, n = nums.size();
92
- for (int right = 0; right < n; ++right) {
93
- if (nums[ right] != 0) {
94
- swap(nums[ left] , nums[ right] );
95
- ++left;
95
+ int i = -1, n = nums.size();
96
+ for (int j = 0; j < n; ++j) {
97
+ if (nums[ j] ) {
98
+ swap(nums[ ++i] , nums[ j] );
96
99
}
97
100
}
98
101
}
@@ -103,12 +106,11 @@ public:
103
106
104
107
```go
105
108
func moveZeroes(nums []int) {
106
- n := len(nums)
107
- left := 0
108
- for right := 0; right < n; right++ {
109
- if nums[right] != 0 {
110
- nums[left], nums[right] = nums[right], nums[left]
111
- left++
109
+ i := -1
110
+ for j, x := range nums {
111
+ if x != 0 {
112
+ i++
113
+ nums[i], nums[j] = nums[j], nums[i]
112
114
}
113
115
}
114
116
}
@@ -122,41 +124,12 @@ func moveZeroes(nums []int) {
122
124
* @return {void} Do not return anything, modify nums in-place instead.
123
125
*/
124
126
var moveZeroes = function (nums ) {
125
- let left = 0 ,
126
- n = nums .length ;
127
- for (let right = 0 ; right < n; ++ right) {
128
- if (nums[right]) {
129
- [nums[left], nums[right]] = [nums[right], nums[left]];
130
- ++ left;
131
- }
132
- }
133
- };
134
- ```
135
-
136
- ``` js
137
- /**
138
- * @param {number[]} nums
139
- * @return {void} Do not return anything, modify nums in-place instead.
140
- */
141
- var moveZeroes = function (nums ) {
142
- let left = 0 ;
143
- let right = left;
144
- while (left < nums .length ) {
145
- if (nums[left] != 0 ) {
146
- left++ ;
147
- } else {
148
- right = left + 1 ;
149
- while (right < nums .length ) {
150
- if (nums[right] == 0 ) {
151
- right++ ;
152
- } else {
153
- let tem = nums[left];
154
- nums[left] = nums[right];
155
- nums[right] = tem;
156
- break ;
157
- }
158
- }
159
- left++ ;
127
+ let i = - 1 ;
128
+ for (let j = 0 ; j < nums .length ; ++ j) {
129
+ if (nums[j]) {
130
+ const t = nums[++ i];
131
+ nums[i] = nums[j];
132
+ nums[j] = t;
160
133
}
161
134
}
162
135
};
0 commit comments