描述
正如二人齐心,其力断金。双指针兄弟二人就像是保护森林的熊大和熊二,让我们看看他们俩是如何保护森林的吧。
方法+题目
一快一慢(螳螂捕蝉,黄雀在后版本)
题目描述
来张图理解一下
由于题目要求不能使用额外的空间,在原地修改数组,所以就可以让熊大在前面快点跑,熊二就先按兵不动,等待发号施令。当熊大发现现在对应的数和之前对应的数不相同时,熊二就改变自己对应的数,往前走一格,熊大也是继续往前走,直到数组遍历完为止。
接下来用代码来
演示一下
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.移除元素来练练手。
一左一右(前后夹击版本)
在前后夹击之前,要先将大写字母转化为小写字母,将空格,非数字字母符号删除,之后熊大和熊二就可以前后夹击,逮到砍树的光头强了。来看看代码。
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;
}
}
希望这篇文章能够帮助到你,内容有待完善的地方还希望能够多多指教。