双指针(实战基础版例题)

描述

正如二人齐心,其力断金。双指针兄弟二人就像是保护森林的熊大和熊二,让我们看看他们俩是如何保护森林的吧。

 

方法+题目

一快一慢(螳螂捕蝉,黄雀在后版本)

26.删除数组中的重复项

题目描述

 

 

 

来张图理解一下

由于题目要求不能使用额外的空间,在原地修改数组,所以就可以让熊大在前面快点跑,熊二就先按兵不动,等待发号施令。当熊大发现现在对应的数和之前对应的数不相同时,熊二就改变自己对应的数,往前走一格,熊大也是继续往前走,直到数组遍历完为止。

接下来用代码来

演示一下

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int xiongda = 1, xionger = 1;
        while (wiongda < n) {
            if (nums[xiongda] != nums[xiongda - 1]) {
                nums[xionger] = nums[xiongda];
                ++xionger;
            }
            ++xiongda;
        }
        return xionger;
    }
}

 接下来就可以用 27.移除元素来练练手。

一左一右(前后夹击版本)

125.验证回文数

在前后夹击之前,要先将大写字母转化为小写字母,将空格,非数字字母符号删除,之后熊大和熊二就可以前后夹击,逮到砍树的光头强了。来看看代码。

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sgood = new StringBuffer();
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char ch = s.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                sgood.append(Character.toLowerCase(ch));
            }
        }
        int n = sgood.length();
        int xiongda = 0, xionger = n - 1;
        while (xiongda < xionger) {
            if (Character.toLowerCase(sgood.charAt(xiongda)) != Character.toLowerCase(sgood.charAt(xionger))) {
                return false;
            }
            ++xiongda;
            --xionger;
        }
        return true;
    }
}

接下来就可以用  344.反转字符串 来练练手

大BOSS

跨越级: 11.盛最多水的容器 

 

 看到这道题,

 我们可以先分析一下,要找盛水最多的容器,那容器容纳多少的公式是 底*高。那么两个指针可以先一个位于左边,一个位于右边,那么,底就等于两个指针之间的距离,高就是两个指针所指向的数据当中最小的那个(木桶效应)。那么,无论是右指针指针左移,还是左指针右移,底都会减小,具体怎么移,就可以看看高是如何变化的。对于高,

若向内 移动短板 ,水槽的短板可能变大,因此下个水槽的面积 可能增大 。
若向内 移动长板 ,水槽的长板可能变小或者不变,因此下个水槽的面积 一定变小 。

所以我们要比较两个指针所指数据的大小后,移动指向指向较小数据的指针。当然,每一次移动都会有不同的结果,比较后取最大。

代码如下:

public class Solution {
    public int maxArea(int[] height) {
        int l = 0, r = height.length - 1;
        int ans = 0;
        while (l < r) {
            int area = Math.min(height[l], height[r]) * (r - l);
            ans = Math.max(ans, area);
            if (height[l] <= height[r]) {
                ++l;
            }
            else {
                --r;
            }
        }
        return ans;
    }
}

希望这篇文章能够帮助到你,内容有待完善的地方还希望能够多多指教。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值