LeetCode 283. 移动零 | Python
283. 移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
解题思路
思路:双指针
在站内(力扣),这道题中其实已经给了思路。
提示 2:
A two-pointer approach could be helpful here. The idea would be to have one pointer for iterating the array and another pointer that just works on the non-zero elements of the array.
提示中说明,可以考虑使用双指针的方法。
先审题,题中给定一个数组 nums,要求编写函数将所有的 0 移动到数组末尾,而其他非零的元素保持相对顺序。题目要求使用在原数组上操作,不使用额外的数组。
那么这里说一下双指针思路的做法:
-
定义双指针 l e f t left left、 r i g h t right right,初始指向数组的头部; 移动 r i g h t right right 指针开始遍历数组,观察 r i g h t right right 指针对应的元素: 如果 r i g h t right right 指向的元素数值为 0 0 0 时,继续移动指针; 若数值非 0 0 0 时,交换 l e f t left left、 r i g h t right right 两指针对应的数,两指针均向右移动。 当 r i g h t right right 指针到达数组末尾时,遍历结束。
上面方法执行遍历数组时,因为 r i g h t right right 指向元素数值为 0 0 0 时,不执行交换操作直接移动指针,而 l e f t left left 指针此时是没有移动的,也就是说 l e f t left left 会停留在 0 0 0 处等待交换。
而 r i g h t right right 指向元素数值非 0 0 0 时,与 l e f t left left 对应的元素进行交换,每次交换的都是 l e f t left left 指针的零和 r i g h t right right 指针的非零元素,所以相对顺序不会发生变化。
具体的代码实现如下。
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) # 定义指针 left = 0 right = 0 # 开始遍历 while right < n: # right 指针指向元素数值非 0 时,交换元素 if nums[right] != 0: nums[left], nums[right] = nums[right], nums[left] left += 1 right += 1
如有错误,烦请指出,欢迎指点交流。
上一篇:
IDEA上Java项目控制台中文乱码