
https://leetcode.cn/problems/merge-sorted-array/description/

//定义两个指针
//一个指向 nums1 的有效部分的末尾(即 m-1)。
//另一个指向 nums2 的末尾(即 n-1)。
//从 nums1 的最后一个位置开始填充,即从 m+n-1 位置开始。
//比较 nums1 和 nums2 中的当前元素,将较大的元素放入 nums1 的最后位置
//不断移动指针,直到其中一个数组的所有元素都被处理完。
//如果 nums2 中还有剩余的元素(nums1 本身的前面可能已经是有序的),直接将 nums2 中剩下的部分复制到 nums1 中。
//nums1的初始长度就是m+n
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int p1=m-1;//nums1最后一个有效元素的下标
int p2=n-1;//nums2最后一个有效元素的下标
int p=m+n-1;//这个是nums1的总长度的末尾
//从后往前进行合并操作
while(p1>=0&&p2>=0)//循环停止的条件,只要两个数组中都存在未处理的元素的话,就可以继续进行合并的执行操作
{
//因为给我们的nums1和nums2都是递减的数组,是有序的
//每次比较的时候将两组中大的元素放到p的位置
if(nums1[p1]>nums2[p2])
{
nums1[p]=nums1[p1];
p1--;
}
else
{
nums1[p]=nums2[p2];
p2--;
}
p--;//放下一个元素,这里是换位置
}
//到这里的话肯定nums1的指针已经是出界了,不满足循环条件了,但是现在nums2hiatus有元素存在的,那么我们就直接将nums2中剩下的的元素直接复制到nums1中
while(p2>=0)
{
nums1[p]=nums2[p2];
p2--;
p--;
}
}https://leetcode.cn/problems/move-zeroes/description/

这类题可以分为数组划分或者叫做数组分块
解决这类题我们首先就想到了双指针算法
这里的指针是利用数组下标来充当指针
因为在数组中我们可以利用下标索引到对应的元素
我们定义的两个指针一个是dest 一个是cur
两个指针的作用
cur:从左往右扫描数组---遍历数组
dest:已处理的区间内,非0元素的最后一个位置
cur在扫描后会将数组分为两个区间,一个是左边,一个是右边,右边就是待处理的区间,左边就是处理过的
然后再cur处理过的左区间,我们的dest在里面又区分了两个区间,左边的就是非0元素,右边的就是0
所以上面会说dest是已处理的区间内,非0元素的最后一个位置
所以这两个指针将整个数组划分为三个部分

三个区间:
0,dest cur,n-1
非0元素 0 待处理
现在我们的数组有n个元素,那么一开始的下标是0,最后的下标是n-1
那么当我们的cur走到了n的位置,那么就说明整个数组我们已经处理完成了
那么就是说这个待处理的区间已经没了
那么这个时候就是说明整个区间被dest划分为两个区间了
一开始我们让cur指向第一个元素,因为一开始我们没有开始扫描没有非0元素,所以让dest先指向-1下标这个元素
我们先让cur进行从左往右的扫描操作
当我们的cur遇到0元素的时候cur直接向后移动一位就行了
如果我们的cur碰到非0元素的话
先让dest++,然后让cur位置和dest位置的元素进行交换的操作
如何做到cur从前往后遍历的过程中
1.遇到0元素:cur++
2.遇到非0元素:swap(dest+1,cur)
dest++,cur++
class Solution {
public:
void moveZeroes(vector<int>& nums)
{
for(int cur=0,dest=-1;cur<nums.size();cur++)
{
if(nums[cur])//当cur指向的数不等于0的话
swap(nums[++dest],nums[cur]);//让dest自增1,增完之后正是我想要交换的
}
}
};原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。