C语言双指针算法朋友过情人节我过算法

 更新时间:2022年02月14日 14:11:15   作者:乔乔家的龙龙  
这篇文章主要为大家介绍了C语言中双指针算法的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助

双指针

首先咱得知道何为双指针,听起来很上流,其实有手就行。

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

换言之,双指针法充分使用了数组有序这一特征,当遇到有序数组时,应该优先想到双指针来解决问题,因两个指针的同时遍历会减少空间复杂度和时间复杂度从而在某些情况下能够简化运算

在这里插入图片描述

对撞指针

类似于相遇问题,对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针,最右侧的定义为右指针,然后分别从两侧出发,相向遍历链表,这个过程就形象化为对撞,习惯上就将左右指针定义为 left 和 right,我们给出一个大致代码逻辑:

void hit(int *arr,int arrsize)
{
int* left = arr;
int* right = arr + arrsize -1;
while(left<=right)
{
条件语句;
left++;
条件语句;
right--;
}
}

对撞指针适用于二分查找,链表对象求和等,也就是说当你遇到题目给定有序数组时,应该第一时间想到的思路就是使用对撞指针。

快慢指针

类似于龟兔赛跑,快慢指针是两个链表上的指针从同一节点出发,其中一个指针前进速度比另一个快,两个指针以不同的策略移动,直到两个指针的值达成某个条件为止,如图(ppt绘图+手残勿喷):

在这里插入图片描述

我们同样将左右指针定义为 slow,fast,要实现其中一个指针比另一个快,我们无可厚非就两种方法:

1.同时起步,fast 比 slow 多走n步;

2.fast 先走,slow后走;

那我们给出他的逻辑代码:
同时走:

void speed(int *arr)
{
   int* fast = arr;
   int* slow = arr;
   while(slow<fast)
   {
   条件;
   slow++(非条件下fast++);
   }
}

先后走:

void speed(int *arr)
{
int* slow =arr;
int* fast = arr;
while(条件1)
{
slow++;
}
while(条件2)
{
fast++;
}
}

真题实战

1.调整数组顺序使奇数位于偶数前面

int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
  *returnSize = arrayLen;
   int* left = array;
	int* right = array + arrayLen - 1;
	while (left < right)//(1)
	{
		while (left < right && *left % 2 == 1)//(2)
			left++;
		while (left < right && *right % 2 == 0)//(3)
			right--;
		if (left < right)//(4)
		{
			int tmp = *left;
			*left = *right;
			*right = tmp;
		}
		left++;
		right--;
	}
	return array;
}

这道题就是典型的对撞指针,我们遍历完整个数组时,左右指针路程各自一半,只需要 left 寻找奇数,right 寻找偶数做交换即可。

==Ps.==这里的* returnSize

2.Leetcode 真题:移除元素

int removeElement(int* nums, int numsSize, int val) {
	int* p1 = nums;
	int* p2 = nums;
	int sz = numsSize;
	for (; p1 < nums + numsSize; p1++)
	{
		if (*p1 != val)
		{
			*p2 = *p1;
			*p2++;
		}
		else
			sz--;
	}
	return sz;
}  

这是典型的快慢指针,第一个指针用来遍历数组元素,判断是不是要删除的数,第二个指针用来存放数字。如果第一个指针指向的是要删除的元素,那么输出用来存放输出数组元素个数的整形变量sz就自减 1,然后第一个指针向后移动一位,第二个指针不动;如果第一个指针指向的不是要删除的数,那么就把这个数放到第二个指针指向的位置,然后第一个指针和第二个指针都向后移动一位。重复操作直到第一个指针遍历整个数组,此方法的时间复杂度是O(n)。

今天就到这里了,摸了家人们,情人节快乐!更多关于C语言双指针算法的资料请关注脚本之家其它相关文章!

相关文章

  • C语言实现简单弹跳小球

    C语言实现简单弹跳小球

    这篇文章主要为大家详细介绍了C语言实现简单弹跳小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • VS2019开发简单的C/C++动态链接库并进行调用的实现

    VS2019开发简单的C/C++动态链接库并进行调用的实现

    这篇文章主要介绍了VS2019开发简单的C/C++动态链接库并进行调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++中函数重载实例详解

    C++中函数重载实例详解

    这篇文章主要介绍了C++中函数重载实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 带你了解C++中vector的用法

    带你了解C++中vector的用法

    大家好,本篇文章主要讲的是带你了解C++中vector的用法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 大家注意vector, list, set, map成员函数erase

    大家注意vector, list, set, map成员函数erase

    set和map是由红黑树来实现的,当erase的时候迭代器就失效了,也就是说我们要在迭代器失效之前保留一个副本,根据这个副本我们才能继续遍历下一个元素
    2013-09-09
  • C++实现打地鼠游戏设计

    C++实现打地鼠游戏设计

    这篇文章主要为大家详细介绍了C++实现打地鼠游戏设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Linux系统下C语言中的标准IO总结

    Linux系统下C语言中的标准IO总结

    最近用到了C语言的标准IO库,由于对其中的一些细节不是非常清楚,导致了许多Bug,花了好长时间来调试,所以在此做个笔记,这篇文章主要给大家介绍了关于Linux系统下C语言中标准IO的相关资料,需要的朋友可以参考下
    2024-01-01
  • C语言手写多级时间轮定时器

    C语言手写多级时间轮定时器

    这篇文章主要为大家详细介绍了如何利用C语言实现手写多级时间轮定时器,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-09-09
  • C语言实现abs和fabs绝对值

    C语言实现abs和fabs绝对值

    这篇文章主要介绍了C语言实现abs和fabs绝对值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 浅析VSCode launch.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    浅析VSCode launch.json中的各种替换变量的意思 ${workspaceFolder} ${file} $

    这篇文章主要介绍了VSCode launch.json中的各种替换变量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论