当前位置:   article > 正文

代码随想录算法训练营第七天| 哈希表

代码随想录算法训练营第七天| 哈希表

15. 三数之和

  1. public List<List<Integer>> threeSum(int[] nums) {
  2. List<List<Integer>> res = new ArrayList<>();
  3. Arrays.sort(nums);
  4. for (int i = 0; i < nums.length; i++) {
  5. if (nums[i] > 0) {
  6. return res;
  7. }
  8. // 防止i重复:
  9. // 如果nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过
  10. // i > 0 防止数组越界
  11. // [-4,-1,-1,0,1,2],不去重,就会有重复的三元组:[[-1,-1,2],[-1,0,1],[-1,0,1]]
  12. if (i > 0 && nums[i] == nums[i - 1]) {
  13. continue;
  14. }
  15. int left = i + 1;
  16. int right = nums.length - 1;
  17. while (left < right) {
  18. int sum = nums[i] + nums[left] + nums[right];
  19. if (sum > 0) {
  20. right--;
  21. } else if (sum < 0) {
  22. left++;
  23. } else {
  24. // 找到一个三元组
  25. res.add(Arrays.asList(nums[i], nums[left], nums[right]));
  26. // [-2,0,0,2,2], left:1、right:4,此时如果不去重,就会有重复的三元组[-2,0,2]
  27. // 防止left重复:
  28. // 如果sum = 0时,nums[left] == nums[left + 1],则会导致结果重复,应该跳过
  29. while (left < right && nums[left] == nums[left + 1]) {
  30. left++;
  31. }
  32. // 防止right重复:
  33. // 如果sum = 0时,nums[right] == nums[right -1],则会导致结果重复,应该跳过
  34. while (left < right && nums[right] == nums[right -1]) {
  35. right--;
  36. }
  37. // 继续寻找是否有其他三元组
  38. left++;
  39. right--;
  40. }
  41. }
  42. }
  43. return res;
  44. }

四数之和

  1. public List<List<Integer>> fourSum(int[] nums, int target) {
  2. List<List<Integer>> result = new ArrayList<>();
  3. Arrays.sort(nums);
  4. for (int i = 0; i < nums.length; i++) {
  5. // nums[i] > target 直接返回, 剪枝操作
  6. if (nums[i] > 0 && nums[i] > target) {
  7. return result;
  8. }
  9. if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重
  10. continue;
  11. }
  12. for (int j = i + 1; j < nums.length; j++) {
  13. if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重
  14. continue;
  15. }
  16. // 以下与“三数之和”相同
  17. int left = j + 1;
  18. int right = nums.length - 1;
  19. while (right > left) {
  20. // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
  21. long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
  22. if (sum > target) {
  23. right--;
  24. } else if (sum < target) {
  25. left++;
  26. } else {
  27. result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
  28. // 对nums[left]和nums[right]去重
  29. while (right > left && nums[right] == nums[right - 1]) {
  30. right--;
  31. }
  32. while (right > left && nums[left] == nums[left + 1]) {
  33. left++;
  34. }
  35. left++;
  36. right--;
  37. }
  38. }
  39. }
  40. }
  41. return result;
  42. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/494585
推荐阅读
相关标签
  

闽ICP备14008679号