目录
你未来的样子藏在你现在的努力里
🏡个人主页:XiaoXiaoChen-2716
📚学习专栏:力扣专栏
🕒发布日期:2022/11/12
S1:首先是特殊情况判断,如果数组的元素少于三个,那么就肯定没用解;
S2:第二步排序,方便我们使用双指针来进行移动计算;
S3:接下来就开始寻找三个元素,首先对每一组的第一个元素进行判断,由于我们对数组进行了排序,所以如果第一个数都大于0的话那么久肯定没有相加等于0的组合,所以我们直接返回结果;
S4:根据题目要求,我们还需要进行去重操作,即如果连续两个数是相等的,那么我们应当跳过本次循环进入下次,否则结果会重复;
S5:接下来就是利用双指针来求和为0的组合,这里我定义了left = i + 1,right = len - 1,当left小于right的时候才进入循环,此时分为三种情况:
- nums[i] + nums[left] + nums[right] == 0,此时我们需要把这三个元素放到一个链表然后把链表放进结果中,到这还没有结束,接下来同样的是左右两边的去重操作,这里相信读者都能理解,即nums[left] = nums[left + 1]或者nums[right] = nums[right - 1]这两种情况,最后要把指针向中间移动;
- nums[i] + nums[left] + nums[right] > 0,说明此时右边的数太大了,所以我们把right往左移,即right--;
- nums[i] + nums[left] + nums[right] < 0,说明左边的数太小了,所以我们把left右移,即left++;
S6:最后把结果返回即可,因为此题不关心答案的顺序
- Arrays.sort(nums);
- for(int i = 0 ; i < len ; i++){
- if(nums[i] > 0){
- return res;
- }
- if(i >= 1 && nums[i] == nums[i - 1]){
- continue;
- }
- int left = i + 1;
- int right = len - 1;
- while(right > left){
- if(nums[i] + nums[left] + nums[right] == 0){
- List
list = new ArrayList<>(); - list.add(nums[i]);
- list.add(nums[left]);
- list.add(nums[right]);
- res.add(list);
- while(left < right && nums[left] == nums[left + 1]){
- left++;
- }
- while(left < right && nums[right] == nums[right - 1]){
- right--;
- }
- left += 1;
- right -= 1;
- }
- else if(nums[i] + nums[left] + nums[right] > 0){
- right--;
- }else {
- left++;
- }
- }
- class Solution {
- public List
> threeSum(int[] nums) {
- List
> res = new ArrayList<>();
- int len = nums.length;
- if(len < 3){
- return res;
- }
- Arrays.sort(nums);
- for(int i = 0 ; i < len ; i++){
- if(nums[i] > 0){
- return res;
- }
- if(i >= 1 && nums[i] == nums[i - 1]){
- continue;
- }
- int left = i + 1;
- int right = len - 1;
- while(right > left){
- if(nums[i] + nums[left] + nums[right] == 0){
- List
list = new ArrayList<>(); - list.add(nums[i]);
- list.add(nums[left]);
- list.add(nums[right]);
- res.add(list);
- while(left < right && nums[left] == nums[left + 1]){
- left++;
- }
- while(left < right && nums[right] == nums[right - 1]){
- right--;
- }
- left += 1;
- right -= 1;
- }
- else if(nums[i] + nums[left] + nums[right] > 0){
- right--;
- }else {
- left++;
- }
- }
- }
- return res;
- }
- }
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,不好的地方请各位大佬多多指教!