15. 三数之和(java实现)--3种解法(双指针,Hash,暴力)LeetCode
2022/2/10 11:42:40
本文主要是介绍15. 三数之和(java实现)--3种解法(双指针,Hash,暴力)LeetCode,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 题目:
- 解法1:双指针
- 解法2:Hash
- 解法3:暴力
题目:
给你一个包含 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
-10^5 <= nums[i] <= 10^5
解法1:双指针
/** * 思路: * 对数组进行排序,方便我们后续找不重复的三元组 * 我们可以先确定一个数,之后去找后两个数 * 遍历数组 * 如果当前的下标是0,或者当前下标i和前一个数不同进行循环。相同则找下一个数 * 确定另外两个数l和r * 如果sum大于0,要让数接近0,必须让sum变小,移动右侧。 * 小于0,反之。 * 如果等于0就放入结果集result * 之后判断l和r是否有重复值,进行移动 * 最后一起移动l和r(不可能有重复组合等于0,2个一起移动,当然移动一个也可以) */ public static List<List<Integer>> threeSum(int[] nums) { ArrayList<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if (i == 0 || nums[i] != nums[i - 1]) { int l = i + 1, r = nums.length - 1; while (r > l) { int sum = nums[i] + nums[l] + nums[r]; if (sum > 0) { r--; } else if (sum < 0) { l++; } else { result.add(Arrays.asList(nums[i], nums[l], nums[r])); while (r > l && nums[l] == nums[++l]) { } while (r > l && nums[r] == nums[--r]) { } } } } } return result; }
时间复杂度:On^2
空间复杂度:On
解法2:Hash
/** * 思路: * 把三数和转换成两数和 * 2层for,已知2数和,寻找最后一个数,使得3数和为0 * 判断map中是否有所需值,有则进行记录 * 先对3个数进行排序,在放入set去重(防止相同元素不同位置的数组出现) * 没有则把当前数放入map中 */ public static List<List<Integer>> threeSum(int[] nums) { HashSet<List<Integer>> set = new HashSet<>(); for (int i=0;i<nums.length-2;i++){ HashMap<Integer, Integer> map = new HashMap<>(); for (int j=i+1;j<nums.length;j++){ int need=-(nums[i]+nums[j]); if (map.containsKey(need)){ List<Integer> list = Arrays.asList(nums[i], nums[j], need); Collections.sort(list); set.add(list); }else { map.put(nums[j], nums[j]); } } } return new ArrayList<>(set); }
时间复杂度:On^2logn
空间复杂度:On
解法3:暴力
/** * 思路: * 遍历所有可能,找到3数和为0 * 进行排序之后用set进行去重,放入结果集 */ public List<List<Integer>> threeSum(int[] nums) { HashSet<List<Integer>> set = new HashSet<>(); for (int i=0;i<nums.length-2;i++){ for (int j=i+1;j<nums.length-1;j++){ for (int k=j+1;k<nums.length;k++){ if (nums[i]+nums[j]+nums[k]==0){ //排序后存放在set中的集合能保证没有重复 List<Integer> list = Arrays.asList(nums[i], nums[j], nums[k]); Collections.sort(list); set.add(list); } } } } return new ArrayList<>(set); }
时间复杂度:On^3
空间复杂度:On
这篇关于15. 三数之和(java实现)--3种解法(双指针,Hash,暴力)LeetCode的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23JAVA语音识别项目入门教程
- 2024-11-23Java云原生学习:从入门到实践
- 2024-11-22Java创业学习:初学者的全面指南
- 2024-11-22JAVA创业学习:零基础入门到实战应用教程
- 2024-11-22Java创业学习:从零开始的Java编程入门教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22JAVA对接阿里云智能语音服务学习教程
- 2024-11-22Java对接阿里云智能语音服务学习教程
- 2024-11-22Java副业学习:零基础入门到实战项目
- 2024-11-22Java副业学习:零基础入门指南