• [leetcode hot 150]第十五题,三数之和


    题目:

    给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

    你返回所有和为 0 且不重复的三元组。

    注意:答案中不可以包含重复的三元组

    首先需要对数组进行排序。这是因为需要找到所有和为 0 的三元组,而对数组进行排序可以帮助更容易地识别这些三元组。 

    将使用三个指针 ij 和 k 来遍历数组。指针 i 从数组开头开始,指针 j 从数组第二个元素开始,指针 k 从数组末尾开始。

    检查位于 ij 和 k 指针处的元素之和是否等于 0。如果等于 0,我们将把这个三元组添加到 result 列表中。

    如果和小于 0,将把指针 j 向右移动以增大和。如果和大于 0,我们将把指针 k 向左移动以减小和。

    为了避免重复,如果 nums[i]nums[j] 或 nums[k] 与前一个迭代中的元素相同,将跳过当前迭代。

     

    1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. import java.util.List;
    4. public class no_15 {
    5. public static void main(String[] args) {
    6. int[] arr = {-1, 0, 1, 2, -1, -4};
    7. List> lists = threeSum(arr);
    8. for (List list : lists) {
    9. System.out.println(list.toString());
    10. }
    11. }
    12. public static List> threeSum(int[] nums) {
    13. List> re = new ArrayList<>();
    14. Arrays.sort(nums);
    15. for (int i = 0; i < nums.length - 2; i++) {
    16. if (i > 0 && nums[i] == nums[i - 1]) {
    17. continue;
    18. }
    19. int j = i + 1;
    20. int k = nums.length - 1;
    21. while (j < k) {
    22. int sum = nums[i] + nums[j] + nums[k];
    23. if (sum < 0) {
    24. j++;
    25. } else if (sum > 0) {
    26. k--;
    27. } else {
    28. re.add(Arrays.asList(nums[i], nums[j], nums[k]));
    29. while (j < k && nums[j] == nums[j + 1]) {
    30. j++;
    31. }
    32. while (j < k && nums[k] == nums[k - 1]) {
    33. k--;
    34. }
    35. j++;
    36. k--;
    37. }
    38. }
    39. }
    40. return re;
    41. }
    42. }

  • 相关阅读:
    私家车位上海商学院
    界面组件Telerik加强对Fluent主题支持,让应用程序更国际化
    数据库设计
    wps快速生成目录及页码设置(自备)
    【CPP】指针
    全网最全谷粒商城记录_10、环境-docker安装mysql
    玩转Mysql系列 - 第17篇:存储过程&自定义函数详解
    uniapp webview实现双向通信
    linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04
    1093: 分香蕉
  • 原文地址:https://blog.csdn.net/weixin_45201305/article/details/139843137