在许多数组和链表的题中,都需要用到双指针的思想来优化,本文总结归纳了几种常见的双指针和对应的应用案例,通过针对的性的刷题希望能熟练的掌握双指针的运用
文章目录
167.两数之和II-输入有序数组(头尾指针)
定义两个指针,一个是头指针i,一个是尾指针j
判断 numbers[i]+numbers[j]与target的值大大小
如果相等,就返回下标+1的数组
如果target更大,说明数小了,i向后移
如果target更小,说明数大了,j向前移
public class Solution {
public int[] twoSum(int[] numbers, int target) {
int i = 0;
int j = numbers.length - 1;
int sum;
while (i < j) {
sum = numbers[i] + numbers[j];
if (sum == target) return new int[]{
i + 1, j + 1};
else if (sum > target) j--;
else i++;
}
return new int[0];
}
}
633.平方数之和(头尾指针)
a和b的取值在0
到(int)Math.sqrt(c)
之间
所以就以这两个值为上下界进行双指针遍历
public class Solution {
public boolean judgeSquareSum(int c) {
int i = 0;
int j = (int) Math.sqrt(c);
while (i <= j) {
int tmp = i * i + j * j;
if (tmp == c) return true;
else if (tmp > c) j--;
else i++;
}
return false;
}
}
345.反转字符串中的元音字母(头尾指针)
题目的意思是将字符串的正数第n个元音字母
和倒数第n个元音字母
交换
定义头指针i和尾指针j
定义一个char类型的数组
从头尾同时遍历,如果不是元音就直接加入新数组,如果是元音就等到两端都是元音了然后交换写入数组
public class Solution {
public String reverseVowels(String s) {
int i = 0;
int j = s.length() - 1;
char news[] = new char[s.length()];
Set<Character> set = new HashSet<>(Arrays.asList('a', 'e',