算法练习:三数之和
每天两道 leetcode 算法:
三数之和(力扣 15):给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。以下是我的解题过程:
- 因为这里返回的是值不是下表索引,为了更有效地寻找符合要求的数集,这里先对数组进行排序
- 设计双指针 left 和 right, 交替向中间移动,记录每一个符合要求的组合;
- 这里有两个重要的去重操作,防止记录重复的三元组:① nums[i] == nums[i - 1] : 为什么是 i - 1呢,因为 left 是从 i + 1 开始遍历的,如果是 i + 1 的话就意味着结果集中不能包含重复元素,这显然不符合要求,例如 -1,-1,2;② while(left < right && nums[left] == nums[left + 1]) left++; while(left < right && nums[right] == nums[right - 1]) right--; 这是对 left 和 right 索引对应元素的去重,以免找到相同的三元组;
▼class复制代码public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); int left = 0; int right = 0; for(int i = 0; i <= nums.length - 1; i++) { if(nums[i] > 0) { return result; } if(i > 0 && nums[i] == nums[i - 1]){ continue; } left = i + 1; right = nums.length - 1; while(left < right) { if(nums[i] + nums[left] + nums[right] < 0) left ++; else if(nums[i] + nums[ left] + nums[right] > 0) right --; else{ result.add(Arrays.asList(nums[i], nums[left], nums[right])); while(left < right && nums[left] == nums[left + 1])left++; while(left < right && nums[right] == nums[right - 1]) right--; left ++; right --; } } } return result; } }
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
