• 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. }

  • 相关阅读:
    搭建zerotier planet服务
    基于深度学习的Wiki中文语料词word2vec向量模型
    Java的反射
    自动驾驶算法岗笔试题 | 一道有意思的数学题 | 解析及代码实现
    [附源码]计算机毕业设计汽车美容店管理系统Springboot程序
    tomcat8 优化
    linux centos consul1.15.2一键安装部署
    Python跨语言调用Java服务Rpc接口
    string的学习
    数字货币swap交易所逻辑系统开发分析方案
  • 原文地址:https://blog.csdn.net/Getugly/article/details/125894182