主要讲解双指针在数组中应用,有别与在链表中的应用
题解报告LeetCode#15:三数之和
思路:
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int len = nums.length;
if (len < 3) {
return res;
}
//排序是去重的前提
Arrays.sort(nums);
for (int i = 0; i < len - 2; i++) {
if (nums[i] > 0) {
break;
}
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = len - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
List<Integer> cur = new ArrayList<>();
cur.add(nums[i]);
cur.add(nums[left]);
cur.add(nums[right]);
res.add(cur);
// 剪枝 2
while (left < right && nums[left + 1] == nums[left]) {
left++;
}
while (left < right && nums[right - 1] == nums[right]) {
right--;
}
left++;
right--;
} else if (sum > 0) {
// 后面的数太大了,让它往前走一步
right--;
} else {
// sum < 0, 前面的数太小了,让它往后走一步
left++;
}
}
}
return res;
}
}
题解报告LeetCode#167:两数之和Ⅱ-输入有序数组
思路:双指针
代码:
class Solution {
public int[] twoSum(int[] numbers, int target) {
int len = numbers.length;
int left = 0, right = len - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) {
return new int[]{left + 1, right + 1};
} else if (sum > target) {
right--;
} else {
left++;
}
}
return new int[]{-1, -1};
}
}
题解报告LeetCode#658:找到 K 个最接近的元素
思路:双指针,排除法,从两端开始排除
代码:
public class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int size = arr.length;
int left = 0;
int right = size - 1;
int removeNums = size - k;
while (removeNums > 0) {
if (x - arr[left] <= arr[right] - x) {
right--;
} else {
left++;
}
removeNums--;
}
List<Integer> res = new ArrayList<>();
for (int i = left; i < left + k; i++) {
res.add(arr[i]);
}
return res;
}
}