数组相关的问题
尽量把题目总结
双指针问题
1.快慢指针的基础模版
// An highlighted block
int low=0,fast=0;
while(fast<size){
if(满足条件) ++low;
++fast;
}
使用该模版可以解决数组中一些删除操作以及移动操作7,8,,7
1.删除有序数组中的重复项
2.删除数组中的特定元素
3.移动元素值为0的向后方,其他元素相对顺序不变
3.
1.删除有序数组中的重复项
此时当新元素出现,慢指针前进,无论任何时候快指针都会前进
满足前一个元素不等于当前元素,说明当前元素是新元素,慢指针+1;
// An highlighted block
int remove(int *nums,int size){
int low=1,fast=1;//0所指第一个元素一定是,故从1开始
while(fast<size){
if(nums[fast]!=nums[fast-1])
{ nums[low]=nums[fast];++low;}
++fast;
}
return low;
}
2.删除数组中的特定元素
难点在于删除元素后,后面的元素要前进。
慢指针指示未删除元素,快指针一值前进
比较当前元素和特定元素,不等则慢指针前进
// An highlighted block
int remove(int *nums,int size,int val){
int low=0,fast=0;
while(fast<size){
if(nums[fast]!=val)
{ nums[low]=nums[fast];++low;}
++fast;
}
return low;
}
3.移动元素值为0的向后方,其他元素相对顺序不变
low之前指向的全是不为零的,low与fast之间全是0;当快指针遇到不是0的数会与当前low指的值(0)交换
可用当下例子模拟
1-0-2-0-3-0-5
1-2-0-0-3-0-5
1-2-3-0-0-0-5
1-2-3-5-0-0-0
// An highlighted block
int move(int *nums,int size){
int low=0,fast=0;
while(fast<size){
if(nums[fast]!=0)//
{
temp=nums[low];
nums[low]=nums[fast];
nums[fast]=nums[low];
low++;
}
++fast;
}
return low;
}
2.两个数组之间双指针(平行)
模版
// An highlighted block
int p1=0,p2=0;
while(p1<size1&&p2<size2){
//三种情况
if() p1++;p2++;
else if()p1++;
else p2++;
}
1.合并两个有序数组
问题:合并两个单调不减的数组,使其仍然单调不减
思路:创立新数组,比较原来两个数组元素,把比较小的填入新数组;
// An highlighted block
int p1=0,p2=0;
int k=0;//新的遍历变量
int *nums3=(int*)malloc(sizeof(int)*(size1+size2));
while(p1<size1&&p2<size2){
//三种情况
if(nums1[p1]==nums2[p2]) nums3[k]=nums1[p1]; p1++;p2++;
else if(nums1[p1]<nums2[p2]) nums3[k]=nums1[p1];p1++;
else {nums3[k]=nums2[p2];p2++;}
}
2.求两个数组的交集
思路:遍历两个数组,当元素相等是,判断是否已经重复,不重复则存入交集;若不相等,将较小的元素的数组指针前进。
// An highlighted block
int *inter(int *nums1,int *nums2,int size1,int size2){
//先对数组进行排序
sort(nums1,size1);
sort(nums2,size2);
int k=0;//交集的遍历变量
int *nums3=(int*)malloc(sizeof(int)*size1);
int p1=0,p2=0,pre=0;//pre用来指前一个元素,用来判断重复
while(p1<size1&&p2<size2){
//三种情况
if(nums1[p1]==nums2[p2]){
if(nums1[p1]!=pre){//判断是否已经在
nums3[k]=nums1[p1];
pre=nums1[p1]
}
p1++;p2++;
else if(nums1[p1]<nums2[p2])p1++;
else p2++;
}
return nums3;
}