• 牛客网:NC54 三数之和


    1. import java.util.*;
    2. /**
    3. * @author xienl
    4. * @description 三数之和
    5. * @date 2022/6/30
    6. */
    7. public class Solution {
    8. public static void main(String[] args) {
    9. Solution solution = new Solution();
    10. int[] num = {0 , 0, 0 , 0};
    11. System.out.println(solution.threeSum(num));
    12. }
    13. /**
    14. * 三层循环,不行,复杂度过大,执行不完
    15. * @param num
    16. * @return
    17. */
    18. public ArrayList<ArrayList<Integer>> threeSum2(int[] num) {
    19. Arrays.sort(num);
    20. Set<ArrayList<Integer>> res = new HashSet<>();
    21. for (int i = 0; i < num.length; i++){
    22. for (int j = i + 1; j < num.length; j++){
    23. for (int k = j + 1; k < num.length; k++){
    24. if (num[i] + num[j] + num[k] == 0) {
    25. ArrayList<Integer> temp = new ArrayList<>();
    26. temp.add(num[i]);
    27. temp.add(num[j]);
    28. temp.add(num[k]);
    29. Collections.sort(temp);
    30. res.add(temp);
    31. }
    32. }
    33. }
    34. }
    35. return new ArrayList<>(res);
    36. }
    37. /**
    38. * 双指针
    39. * 如果第一个值为a 要想结果为0 ,必须要 第二个和第三个值相加为-a
    40. * @param num
    41. * @return
    42. */
    43. public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
    44. if (num.length < 3){
    45. return new ArrayList<>();
    46. }
    47. Arrays.sort(num);
    48. ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    49. int n = num.length;
    50. for (int i = 0; i < n - 2; i++){
    51. if (i != 0 && num[i] == num[i - 1]) {
    52. continue;
    53. }
    54. if (num[i] > 0){
    55. break;
    56. }
    57. int target = -num[i];
    58. int left = i + 1;
    59. int right = n - 1;
    60. while (left < right){
    61. // 两数字和
    62. int sum = num[left] + num[right];
    63. if (sum == target){
    64. ArrayList<Integer> temp = new ArrayList<>();
    65. temp.add(num[i]);
    66. temp.add(num[left]);
    67. temp.add(num[right]);
    68. res.add(temp);
    69. // 去重
    70. while (left + 1 < right && num[left] == num[left + 1]){
    71. left++;
    72. }
    73. while (right - 1 > left && num[right] == num[right - 1]){
    74. right--;
    75. }
    76. left++;
    77. right--;
    78. } else if (sum > target){
    79. right--;
    80. } else {
    81. left++;
    82. }
    83. }
    84. }
    85. return res;
    86. }
    87. }

  • 相关阅读:
    RISC-V峰会一周年,全志做了这些事
    【机器学习基础】 线性回归
    sklearn基础篇(六)-- 决策树(decision tree)
    IDL学习——哨兵2 L1C数据辐射定标
    10 个高质量 AI 助手工具站点,你值得拥有的哦
    前端css元素yi
    YYGH-9-预约下单
    使用Postman调试API遇到“400 Bad Request”问题
    SQLi-Labs系列之堆叠注入
    RPC vs. HTTP:谁主沉浮在网络通信的江湖?
  • 原文地址:https://blog.csdn.net/newOneObject/article/details/125538464