题解 | #三数之和#

三数之和

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

双指针的思想,先将数组排序,之后设定当前值(遍历即可),然后在当前值后一位为left指针,数组尾为right指针,将当前值和指针指向的数字相加判断大小,等于0则记录,小于零移动left,大于0移动right。同时注意重复值的过滤,若果重复讲指针移动,以及当前值重复的话跳出本次循环,移动后再进入循环。

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    
        if(num.length < 3){
            return res;
        }
       Arrays.sort(num);
       for(int i = 0;i<num.length;i++){
           int cur = num[i];
           int left = i+1;
           int right = num.length-1;
           //最小值大于0了,没有相加的必要了。
             if(cur>0){
                   return res;
               }
              if(i>0 && num[i]==num[i-1]){
                continue;
              }
           while(left<right){
               if(cur + num[left] + num[right] == 0){
                   ArrayList<Integer> arr = new ArrayList<>();
                   arr.add(cur);
                   arr.add(num[left]);
                   arr.add(num[right]);
                   res.add(arr);
                   while(left<right&&num[left] == num[left+1]){
                        left = left + 1;
                    }
                    while(left<right&&num[right] == num[right-1]){
                        right = right - 1;
                    }
                    left++;
                    right--;
               }else if(cur + num[left] + num[right]<0){
                   left = left + 1;
               }else{
                   right =right - 1;
               }
           }
               
           }
           return res;
       }

    }

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 14:35
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
见见123:简历没有啥问题,是这个社会有问题。因为你刚毕业,没有工作经历,现在企业都不要没有工作经历的。社会病了。
点赞 评论 收藏
分享
07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务