1. 背景
双指针可以巧妙解决一些leetcode的算法问题,做个总结方便自己做出一些规律总结,方便举一反三
2. demo
2.1 392. 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
public class Leetcode392Bak {
public boolean isSubsequence(String s, String t) {
int length = t.length();
int j = 0;
for (int i = 0; i < length && j < s.length() ; i++) {
if (t.charAt(i) == s.charAt(j)){
j ++;
}
}
return j == s.length();
}
}
des: 一定要预防短的指针产生index out of range的情况
2.2 125. 验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
public boolean isPalindrome(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isLetterOrDigit(c)){
sb.append(Character.toLowerCase(c));
}
}
return new StringBuffer(sb).reverse().toString().equals(sb.toString());
}
2.3 167. 两数之和 II - 输入有序数组
两个指针慢慢的缩进
public int[] twoSum(int[] numbers, int target) {
int i = 0;
int j = numbers.length - 1;
while (i < j){
if (numbers[i] + numbers[j] < target ){
i ++;
} else if (numbers[i] + numbers[j] > target) {
j --;
} else {
return new int[]{i + 1, j + 1};
}
}
return new int[]{-1, -1};
}
2.4 11. 盛最多水的容器
一前一后两个指针慢慢向中间逼近
public int maxArea(int[] height) {
int i = 0;
int j = height.length -1;
int result = 0;
while (j > i){
int area = (j -i) * Math.min(height[i], height[j]);
result = Math.max(result, area);
if (height[i] >= height[j]){
j --;
} else {
i ++;
}
}
return result;
}