双指针的用法以及题解
双指针在算法中经常用到,它的目的主要是用于遍历数组或者检查链表中的一些问题,两个指针指向不同的元素,从而协同完成任务。双指针主要分为两种:快慢指针和左右指针。
1、快慢指针
快慢指针是指移动的步长,即每次向前移动速度的快慢。
示例
找到未知长度单链表的中间结点
分析
定义两个指针,都指向单链表的第一个元素,让第一个指针的移动速度是第二个指针的速度的两倍,当第一个节点指向链表末尾时,第二个指针指向中间结点。
int getMidNode(LNode *C) {
LNode *search, *mid;
int s, m;
search = mid = C -> next;
while ( (search -> next) != NULL) {
if ( (search -> next -> next) != NULL) {
search = search -> next -> next;
s = search -> data;
mid = mid -> next;
m = mid -> data;
}
else {
search = search -> next;
}
}
int e = mid -> data;
return e;
}
2、左右指针
左右指针一般用来解决区间内某个值的问题。
示例1
反转数组 (利用两个指针对应左右边缘元素,依次进行交换,直到指针反转为止。)
Void reverse(int nums[]){
int left = 0,right;
int len = sizeof(nums) / sizeof(int);
right = len – 1;
while(left < right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
示例2
盛最多水的容器
分析
双指针起初分别对应数组元素的首尾端,因为是求面积,所以与两指针指向的最小值和两指针指向的值之间地长度有关,若有一段小,则以这一段为基点的所有面积中只有另一端最远时面积最大,记录下这一组数据中最大的面积,由于面积与两值的最小值有关,与大值无关,所以每次只需挪动最小值
得一端来计算最大面积,知道两指针所对应的值相等为止。
int maxArea(int* height, int heightSize){
if(heightSize < 2){
return -1;
}
int i = 0, j = heightSize - 1, area = 0;
while(i < j){
int h = min(height[i], height[j]);
area = max(area, h * (j - i)); //存储所有面积中最大值
if(height[i] < height[j]){
i++; //遍历完最大高度
}
else{
j--;
}
}
return area;
}
现在就想到这么多,不全的以后再补充。。。