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版本
    
  • 相关阅读:
    keras使用AutoEncoder对mnist数据降维
    maven插件生成可执行jar包
    python基于opencv实现人脸定位
    使用Jieba提取文章的关键词
    汉语词性对照表
    SQL优化
    keras基于卷积网络手写数字识别
    统计学习
    log4j和slf4j的区别
    log4j配置详解(非常详细)
  • 原文地址:https://www.cnblogs.com/ukzq/p/14478981.html
Copyright © 2011-2022 走看看