主要讲解双指针在数组中应用,有别与在链表中的应用

题解报告LeetCode#15:三数之和

题意:LeetCode#15:三数之和

思路:

代码:

  1. class Solution {
  2. public List<List<Integer>> threeSum(int[] nums) {
  3. List<List<Integer>> res = new ArrayList<>();
  4. int len = nums.length;
  5. if (len < 3) {
  6. return res;
  7. }
  8. //排序是去重的前提
  9. Arrays.sort(nums);
  10. for (int i = 0; i < len - 2; i++) {
  11. if (nums[i] > 0) {
  12. break;
  13. }
  14. if (i > 0 && nums[i] == nums[i - 1]) {
  15. continue;
  16. }
  17. int left = i + 1;
  18. int right = len - 1;
  19. while (left < right) {
  20. int sum = nums[i] + nums[left] + nums[right];
  21. if (sum == 0) {
  22. List<Integer> cur = new ArrayList<>();
  23. cur.add(nums[i]);
  24. cur.add(nums[left]);
  25. cur.add(nums[right]);
  26. res.add(cur);
  27. // 剪枝 2
  28. while (left < right && nums[left + 1] == nums[left]) {
  29. left++;
  30. }
  31. while (left < right && nums[right - 1] == nums[right]) {
  32. right--;
  33. }
  34. left++;
  35. right--;
  36. } else if (sum > 0) {
  37. // 后面的数太大了,让它往前走一步
  38. right--;
  39. } else {
  40. // sum < 0, 前面的数太小了,让它往后走一步
  41. left++;
  42. }
  43. }
  44. }
  45. return res;
  46. }
  47. }

题解报告LeetCode#167:两数之和Ⅱ-输入有序数组

题解:LeetCode#167:两数之和Ⅱ-输入有序数组

思路:双指针

代码:

  1. class Solution {
  2. public int[] twoSum(int[] numbers, int target) {
  3. int len = numbers.length;
  4. int left = 0, right = len - 1;
  5. while (left < right) {
  6. int sum = numbers[left] + numbers[right];
  7. if (sum == target) {
  8. return new int[]{left + 1, right + 1};
  9. } else if (sum > target) {
  10. right--;
  11. } else {
  12. left++;
  13. }
  14. }
  15. return new int[]{-1, -1};
  16. }
  17. }

题解报告LeetCode#658:找到 K 个最接近的元素

题意:LeetCode#658:找到 K 个最接近的元素

思路:双指针,排除法,从两端开始排除

代码:

  1. public class Solution {
  2. public List<Integer> findClosestElements(int[] arr, int k, int x) {
  3. int size = arr.length;
  4. int left = 0;
  5. int right = size - 1;
  6. int removeNums = size - k;
  7. while (removeNums > 0) {
  8. if (x - arr[left] <= arr[right] - x) {
  9. right--;
  10. } else {
  11. left++;
  12. }
  13. removeNums--;
  14. }
  15. List<Integer> res = new ArrayList<>();
  16. for (int i = left; i < left + k; i++) {
  17. res.add(arr[i]);
  18. }
  19. return res;
  20. }
  21. }