数组相关的问题

本文详细介绍了双指针方法在处理数组问题中的三个实例:删除有序数组中的重复项、删除特定元素和移动值为0的元素,以及合并两个有序数组和求两个数组的交集。通过快慢指针的巧妙运用,简化了操作步骤并优化了时间复杂度。
摘要由CSDN通过智能技术生成

数组相关的问题

尽量把题目总结

双指针问题

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;
}

未完持续。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值