leetcode283之移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes

代码实现:

  

 1 def moveZeros(nums):
 2     n = len(nums)
 3     for i in range(n):
 4         for j in range(n - i - 1):
 5             if nums[j] == 0:
 6                 nums[j], nums[j + 1] = nums[j + 1], nums[j]
 7 
 8     # return nums
 9 
10 
11 print("-------测试moveSeros()------")
12 nums = [0, 1, 0, 3, 0, 12]
13 moveZeros(nums)
14 print(nums)
15 
16 
17 def moveZeros1(nums):
18     '''
19     双指针法解决
20     :param nums:
21     :return:
22     '''
23     left, right = 0, 0
24     while right < len(nums):
25         if nums[right] != 0:
26             nums[left], nums[right] = nums[right], nums[left]
27             left += 1
28             right += 1
29         else:
30             right += 1
31 
32 
33 print("-------测试moveSeros()------")
34 nums = [0, 1, 0, 3, 0, 12]
35 moveZeros1(nums)
36 print(nums)
37 
38 
39 def bubbleSort(nums):
40     '''
41     冒泡排序
42     :param nums:
43     :return:
44     '''
45     n = len(nums)
46     for i in range(n):
47         for j in range(n - i - 1):
48             if nums[j] > nums[j + 1]:
49                 nums[j], nums[j + 1] = nums[j + 1], nums[j]
50 
51     return nums
52 
53 
54 print("-----测试bububleSort(nums)-------")
55 nums = [2, 1, 3, 5, 2]
56 numSort = bubbleSort(nums)
57 print(numSort)

总结:上述采用两种方法实现,方法1参考冒泡排序思想,方法2采用双指针。方法2时间复杂度低,为O(N),方法1时间复杂度为O(N^2).顺带写出了冒泡排序。

双指针实现过程:题目要求将0移动到数组后面,保持非零元素顺序不变,将其移到前面,因此双指针实现过程中,设定两个指针,快指针和慢指针,当快指针指向元素非零时,交换快指针和慢指针值,然后将快慢指针同时向后移动;当快指针指向元素为0时,向后移动,直至移动到数组末尾,结束循环。

方法1参开冒泡排序思想,从头开始遍历数组,若元素为0,将该元素和下一个相邻元素交换,每遍历一遍,会移动一个0元素至数组末尾。

原文地址:https://www.cnblogs.com/rounie/p/13474741.html