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版本
    
  • 相关阅读:
    ASP.NET 2.0 中改进的缓存功能
    Python 一门神奇的语言
    showModalDialog()、showModelessDialog()方法使用详解
    在VS2005中 GridView导入Excel的两点小技巧附源码
    DVB码流中业务信息与电子节目指南
    js 日历控件
    js收藏
    什么是ECM,EMM,AU,EMU?
    精解PSISI(一)
    Oracle第四课(学习笔记)
  • 原文地址:https://www.cnblogs.com/ukzq/p/14478981.html
Copyright © 2011-2022 走看看