
一、题目介绍
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:
输入: nums = [0] 输出: [0]
提示:
1 <= nums.length <= 10^4-2^31 <= nums[i] <= 2^31 - 1
二、双指针原理
使用两个指针进行遍历:
- 当前维护指针 (cur): 用于遍历整个数组。
- 边界维护指针 (dest): 指向当前最后一个非零元素的位置。
维护方向: 从左到右扫描,遇到非零元素时将其交换到边界位置之后。
条件边界: 当 nums[cur] != 0 时,执行交换操作。
三、三指针原理
在双指针基础上增加一个指针,用于维护另一侧的性质块。中间第三块即为剩余性质的集合。
应用
1. 快速排序
利用基准元素将数组分为小于、等于、大于三部分,递归处理左右无序块。
给你一个整数数组 nums,请你将该数组升序排列。
你必须在不使用任何内置函数的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。
**示例 1:输入:**nums = [5,2,3,1] 输出:[1,2,3,5]
**示例 2:输入:**nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5]
2. 快速选择找元素
全排好下去找至少有排序的 N*logN,只排三块式基准下去找 N。
2.1 找第 k 大元素
215. 数组中的第 K 个最大元素 - 力扣(LeetCode)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。


