zoukankan      html  css  js  c++  java
  • 三数之和

    class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
            //创建返回集合
            List<List<Integer>> resultList = new ArrayList();
            //获取数组长度
            int len = nums.length;
            //判定传入整数数组大小是否小于3或为null,这样不符合条件直接返回集合
            if(len<3 || nums==null){
                return resultList;
            }
            //必须排好序才能进行
            Arrays.sort(nums);
            //排好序后,开始循环数据操作,获取一个基数nums[i],一个左侧相加数L,一个右侧相加数R
            for(int i=0;i<len;i++){
                //如果当前数字大于0,则三数字之和一定大于0,所以结束循环
                if(nums[i]>0) break;
                if(i>0 && nums[i] == nums[i-1]) continue;
                //左侧设定为当前基数+1下标
                int L =i+1;
                //右侧设置为数组长度-1,最后一位
                int R = len-1;
                //防止重叠交错
                while(L<R){
                    int sum = nums[i]+nums[L]+nums[R];
                    if(sum==0){
                        resultList.add(Arrays.asList(nums[i],nums[L],nums[R]));
                        //此时相加的数据为0,因为结果集不要重复的三元组,此时要判定重复
                        //递增一个L,此时还不够,因为此时下标会停留在最后一个重复的L上,最终if里还有L++会递增
                        while(L<R && nums[L] == nums[L+1]) L++; //左侧去重
                        while(L<R && nums[R] == nums[R-1]) R--; //右侧去重
                        L++;
                        R--;
                  }
                  //当结果小于0时,肯定要提升L,因为排序好的数,左侧为小,右侧为大.
                  else if(sum<0) L++;
                  //当结果大于0时,肯定要降低R,因为排序好的数,右侧为大,按序降低.
                  else if(sum>0) R--;
                }
            }
            return resultList;
        }
     
    }
    

    Java 8特性版

    用到了下标取数  stream版本无法很好复刻for while版本
    
  • 相关阅读:
    什么是Web Service?
    按钮上显示值的轮流切换
    跟偶一起做:击退眼睛疲劳的五大运动
    Windows下权限设置详解
    实现数据分类汇总的SQL语句
    毕业不吼不快十首经典歌曲
    使用命令查看自己的外网IP地址
    如何面对30岁?
    JavaScript中this关键字使用方法详解
    发掘WinRAR的“自解压安装”功能
  • 原文地址:https://www.cnblogs.com/ukzq/p/14478981.html
Copyright © 2011-2022 走看看