题目来源
题目描述
题目解析
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
for (int i = 0; i < nums.size(); ++i) {
if(nums[i] != 0){
swap(nums[i], nums[j]);
j++;
}
}
}
};
双指针
慢指针(lastnonzerofoundat)之前的所有元素都是非零的。
当前指针和慢速指针之间的所有元素都是零。
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1){
return;
}
int pre = -1; // 初始时还没有指向任何0
int cur = 0; // 初始时指向第一个元素
for (; cur < nums.length; cur++){
if (nums[cur] == 0){
if (pre == -1){
pre = cur;
}
}else{
if (pre != -1){
nums[pre++] = nums[cur];
nums[cur] = 0;
}
}
}
}
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int pre = -1, cur = 0;
for (; cur < nums.size(); cur++) {
if(nums[cur] == 0){
if(pre == -1){
pre = cur;
}
}else{
if(pre != -1){
nums[pre++] = nums[cur];
nums[cur] = 0;
}
}
}
}
};
两次遍历
我们创建两个指针i和j,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。
第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
void moveZeroes(vector<int>& nums) {
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for (int i = 0; i < nums.size(); ++i) {
if(nums[i] != 0){
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了. 所以第二次遍历把末尾的元素都赋为0即可
for (int i = j; i < nums.size(); ++i) {
nums[i] = 0;
}
}
快排
快速排序首先要确定一个待分割的元素做中间点x,然后把所有小于等于x的元素放到x的左边,大于x的元素放到其右边。
这里我们可以用0当做这个中间点,把不等于0(注意题目没说不能有负数)的放到中间点的左边,等于0的放到其右边。
// 注意:快排是非稳定排序
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1){
return;
}
int j = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] != 0){
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
优化
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1){
return;
}
int j = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] != 0){
if (i > j){
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
}
}