移动零
解题思路
利用冒泡,元素交换的基本思想:当
num[i] == 0 && nums[i+1] != 0
时交换元素。若本轮没有交换元素,可以提前跳出循环双指针法,两次遍历。创建两个指针
i
和j
,第一次遍历的时候指针j
记录有多少个非零元素。第一次遍历完后,j
指针的下标就指向了最后一个非零元素下标。第二次遍历的时候,起始位置就从j
开始,将剩下的这段区域内的元素全部置为0
双指针法,一次遍历。参照了快速排序的基本思想,把
0
作为中间点,把不等于0
的放到中间点的左边,等于0
的放到其右边。使用两个指针i
和j
,只要nums[i]!=0
,就交换nums[i]
和nums[j]
解题代码
- 冒泡,元素交换
1 | func moveZeroes(nums []int) { |
- 双指针,两次遍历:
1 | func moveZeroes(nums []int) { |
- 双指针,一次遍历:
1 | func moveZeroes(nums []int) { |
调整数组顺序使奇数位于偶数前面
解题思路
基于快速排序的基本思想,奇数在中间点的左边,偶数在中间点的右边
解题代码
1 | func exchange(nums []int) []int { |
手撕归并排序
解题思路
归并排序
解题代码
1 | var aux []int // 用于实现归并的辅助数组 |
最小的k个数
解题思路
利用堆排序,在建成小根堆后,每一次调整都会选择出堆中最小的元素。所以,对堆进行k
次调整,即可得到最小的k
个数。
解题代码
1 | func getLeastNumbers(arr []int, k int) []int { |