• 15. 三数之和


    15. 三数之和icon-default.png?t=M666https://leetcode.cn/problems/3sum/

    难度中等4997收藏分享切换为英文接收动态反馈

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

    示例 1:

    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]
    

    示例 2:

    输入:nums = []
    输出:[]
    

    示例 3:

    输入:nums = [0]
    输出:[]
    

    提示:

    • 0 <= nums.length <= 3000
    • -105 <= nums[i] <= 105

    通过次数1,051,526提交次数2,933,671

    无法去重:

    1. class Solution {
    2. public List> threeSum(int[] nums) {
    3. //排序:冒泡排序
    4. for(int i=1;i
    5. {
    6. int flag =0;
    7. for(int j=0;j
    8. {
    9. if(nums[j]>nums[j+1])
    10. {
    11. int temp = nums[j];
    12. nums[j] = nums[j+1];
    13. nums[j+1] = temp;
    14. flag = 1;
    15. }
    16. }
    17. if(flag ==0) break;
    18. }
    19. for(int i=0;i
    20. {
    21. System.out.print(nums[i]+" ");
    22. }
    23. System.out.println();
    24. List> ans = new ArrayList>();
    25. for(int i=0;i
    26. {
    27. int left =i+1;
    28. int right = nums.length-1;
    29. while(left
    30. {
    31. System.out.println(nums[i]+" "+nums[left]+" "+nums[right]);
    32. if(nums[i]+nums[left]+nums[right]==0)
    33. {
    34. List list = new ArrayList();
    35. list.add(nums[i]);
    36. list.add(nums[left]);
    37. list.add(nums[right]);
    38. ans.add(list);
    39. left++;
    40. continue;
    41. }
    42. if(nums[i]+nums[left]+nums[right]>0) right--;
    43. if(nums[i]+nums[left]+nums[right]<0) left++;
    44. }
    45. }
    46. return ans;
    47. }
    48. }

    会存在重复数据。

     修改后

    1. class Solution {
    2. public List<List<Integer>> threeSum(int[] nums) {
    3. //排序:冒泡排序
    4. for(int i=1;i
    5. {
    6. int flag =0;
    7. for(int j=0;j
    8. {
    9. if(nums[j]>nums[j+1])
    10. {
    11. int temp = nums[j];
    12. nums[j] = nums[j+1];
    13. nums[j+1] = temp;
    14. flag = 1;
    15. }
    16. }
    17. if(flag ==0) break;
    18. }
    19. List<List<Integer>> ans = new ArrayList<List<Integer>>();
    20. for(int i=0;i
    21. {
    22. if (nums[i] > 0) return ans;
    23. if (i > 0 && nums[i] == nums[i - 1]) continue;
    24. int left =i+1;
    25. int right = nums.length-1;
    26. while(left
    27. {
    28. if(nums[i]+nums[left]+nums[right]>0) right--;
    29. else if(nums[i]+nums[left]+nums[right]<0) left++;
    30. else if(nums[i]+nums[left]+nums[right]==0)
    31. {
    32. List<Integer> list = new ArrayList<Integer>();
    33. list.add(nums[i]);
    34. list.add(nums[left]);
    35. list.add(nums[right]);
    36. ans.add(list);
    37. while(right>left && nums[right]==nums[right-1])right--;
    38. while(right>left && nums[left]==nums[left+1]) left++;
    39. right--;
    40. left++;
    41. }
    42. }
    43. }
    44. return ans;
    45. }
    46. }

    果然不用自己排序就快很多啊

    1. class Solution {
    2. public List<List<Integer>> threeSum(int[] nums) {
    3. //排序:
    4. Arrays.sort(nums);
    5. List<List<Integer>> ans = new ArrayList<List<Integer>>();
    6. for(int i=0;i
    7. {
    8. if (nums[i] > 0) return ans;
    9. if (i > 0 && nums[i] == nums[i - 1]) continue;
    10. int left =i+1;
    11. int right = nums.length-1;
    12. while(left
    13. {
    14. if(nums[i]+nums[left]+nums[right]>0) right--;
    15. else if(nums[i]+nums[left]+nums[right]<0) left++;
    16. else if(nums[i]+nums[left]+nums[right]==0)
    17. {
    18. List<Integer> list = new ArrayList<Integer>();
    19. list.add(nums[i]);
    20. list.add(nums[left]);
    21. list.add(nums[right]);
    22. ans.add(list);
    23. while(right>left && nums[right]==nums[right-1])right--;
    24. while(right>left && nums[left]==nums[left+1]) left++;
    25. right--;
    26. left++;
    27. }
    28. }
    29. }
    30. return ans;
    31. }
    32. }
    1. class Solution {
    2. public List<List<Integer>> threeSum(int[] nums) {
    3. List<List<Integer>> ans = new ArrayList<List<Integer>>();
    4. //先排序(避免重复元素)
    5. Arrays.sort(nums);
    6. /*
    7. 二重循环:
    8. 1.一层循环,确定target
    9. 2.二层循环,找到两个数 == target
    10. */
    11. for(int a=0;a
    12. {
    13. if(a>0 && nums[a] == nums[a-1]) continue;
    14. int target = -nums[a];
    15. for(int b = a+1,c=nums.length-1;b
    16. {
    17. if(b>a+1 && nums[b] == nums[b-1]) continue;
    18. while(btarget) c--;
    19. if(b!=c && (nums[b]+nums[c])==target)
    20. {
    21. List<Integer> l = new ArrayList<Integer>();
    22. l.add(nums[a]);
    23. l.add(nums[b]);
    24. l.add(nums[c]);
    25. ans.add(l);
    26. }
    27. }
    28. }
    29. return ans;
    30. }
    31. }

  • 相关阅读:
    1-4 AUTOSAR方法论
    java版linux文件上传
    centos-7安装mysql-8
    JVM学习笔记
    月是故乡明,每逢佳节倍思亲,近乡情更怯
    进阶三部曲第一部《Android进阶之光》第2版已出版
    若依架构下的质检项目的记录
    栈和堆什么意思,Rust所有权机制又是什么
    GEE打开NASA-USDA增强型SMAP全球土壤水分数据(10KM,2015-2020)
    出海 SaaS 企业增长修炼手册2:Kyligence 落地 PLG 是如何避坑的?
  • 原文地址:https://blog.csdn.net/Getugly/article/details/125894182