主要讲解双指针在数组中应用,有别与在链表中的应用
题解报告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);// 剪枝 2while (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;}}
