双指针算法总结

2020-05-12  本文已影响0人  STACK_ZHAO

简介

双指针算法其实也可以称作是滑动窗口法,跟上一篇介绍的最长回文子串的介绍很相似,都是用两个指针来表示指针中间的区域,然后来计算区域中的数值或者是算一定的面积等。首先起始最原始是在链表里面,最简单的一个应用是判断链表是否有环,即用快慢指针来结合判断,

structure ListNode{
 int val;
 node *next;
};
 ListNode * head = (ListNode*)malloc(sizeof(ListNode));
boolean hasCycle(ListNode head) {
    ListNode fast, slow;
    fast = slow = head;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        
        if (fast == slow) return true;
    }
    return false;
}

这只是一个简单的应用,起始双指针在字符串里面由很广泛的应用,上一篇,最长的回文子串、最大子序列等,都是可以用双指针的方法来做的。双指针的主要思路如下所示,主要分为两个步骤

下面以一个简单的例子来说明一下

水桶的最大盛水面积(Leetcode 11)
题目的描述主要就是找出木板里面盛水最多的区域,就是找出最大的面积。
代码如下:

int maxArea(vector<int>& height) {
  int len=height.size();
  int left=0,res=0,right=len-1;
  while(left<len&&right>0){
          int area=(right-left)*min(height[right],height[left]);
          if(res<area)
              res=area;
          if(height[right]<height[left])//判断左右指针移动的顺序,移动的是移动小的那边,这个地方实现判断
              right--;
          else
              left++;
      }
    return res;
}

上一篇下一篇

猜你喜欢

热点阅读