2020-12-18

2020字节跳动的社招算法 三数之和

引言  

      给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

   1:通过双循环 + 二分查找算法获取结果

 1 public List<List<Integer>> threeSum1(int[] nums){ 2   List<List<Integer>> result=new ArrayList(); 3   if(null==nums || nums.length<=3){ 4   return result; 5   } 6   //先对数组排序 7   Arrays.sort(nums); 8   //通过双循环+二分查找获取结果 9   for(int beginIndex= 0 ; beginIndex < nums.length-2 && nums[beginIndex]<=0;beginIndex++){10   if(beginIndex>0 && nums[beginIndex]==nums[beginIndex-1]) continue;//已经匹配过的元素直接跳过11    for(int endIndex=nums.length-1 ; endIndex > beginIndex+1 && nums[endIndex]>=0;endIndex--){12     if(endIndex<(nums.length-1) && nums[endIndex]==nums[endIndex+1]) continue;//已经匹配过的元素直接跳过13     int temp=-(nums[beginIndex]+nums[endIndex]);14     int searchIndex=Arrays.binarySearch(nums,beginIndex+1,endIndex,temp);15     if(searchIndex>0){16      result.add(new ArrayList<Integer>(Arrays.asList(nums[beginIndex],nums[endIndex],nums[searchIndex])));17     }18    }19   }20   return result;21  }

 1 package com.svse.test; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.List; 5  6 public class SuanFaSum { 7  8  public static void main(String[] args) { 9   int[] nums = {-1, 0, 1, 2, -1, -4, -2};10   SuanFaSum sum=new SuanFaSum();11   long start=System.currentTimeMillis();12   List<List<Integer>> allOptions=sum.threeSum1(nums);13   System.out.printf("数组%s 中三树之和为0的组合有:\n",Arrays.toString(nums));14   for(List<Integer> option:allOptions){15    System.out.printf("%s \n",option); 16    }17   long end=System.currentTimeMillis();18   System.out.println("用时:"+(end-start)+"毫秒");19 20  }21 }

 

 

 2:双索引搜索算法

 1 public List<List<Integer>> threeSum2(int[] nums) { 2   List<List<Integer>> result = new ArrayList(); 3   if (null == nums || nums.length <= 3) { 4    return result; 5   } 6   //先对数组排序 7   Arrays.sort(nums); 8   //双索引搜索算法 9   for(int i=0;i<nums.length-2 && nums[i]<=0;i++){10    if(i>0 && nums[i]==nums[i-1]) continue;//已经匹配过的元素直接跳过11    int beginIndex=i+1;12    int endIndex=nums.length-1;13    while (beginIndex<endIndex){14     if(beginIndex>(i+1) && nums[beginIndex]==nums[beginIndex-1]){15      beginIndex++;16     }17     if(endIndex <(nums.length-1) && nums[endIndex]==nums[endIndex+1]){18      endIndex--;19     }20     int temp=nums[i]+nums[beginIndex]+nums[endIndex];21     //根据当前三个数的和,判断是起始索引向后移动还是结束索引向前移动,如果为0,则两个索引同时移动22     if(temp>0){23      endIndex--;24     }else if(temp<0){25      beginIndex++;26     }else{27      result.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[beginIndex],nums[endIndex])));28      beginIndex++;29      endIndex--;30     }31    }32   }33 34   return result;35  }

 1 package com.svse.test; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.List; 5  6 public class SuanFaSum { 7  8  public static void main(String[] args) { 9   int[] nums = {-1, 0, 1, 2, -1, -4, -2};10   SuanFaSum sum=new SuanFaSum();11   long start=System.currentTimeMillis();12   List<List<Integer>> allOptions=sum.threeSum2(nums);13   System.out.printf("数组%s 中三树之和为0的组合有:\n",Arrays.toString(nums));14   for(List<Integer> option:allOptions){15    System.out.printf("%s \n",option); 16    }17   long end=System.currentTimeMillis();18   System.out.println("用时:"+(end-start)+"毫秒");19 20  }21 }

 









原文转载:http://www.shaoqun.com/a/501335.html

1号店网:https://www.ikjzd.com/w/2263

吉祥邮:https://www.ikjzd.com/w/1565

aca:https://www.ikjzd.com/w/1371


引言给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?请你找出所有满足条件且不重复的三元组。1:通过双循环+二分查找算法获取结果1publicList<List<Integer>>threeSum1(int[]nums){2List<List<Integer>>result=newArrayList()
cima:cima
reddit:reddit
如果我是亚马逊新手小卖,该如何选择产品?:如果我是亚马逊新手小卖,该如何选择产品?
深度分析:北美社交电商发展趋势如何?:深度分析:北美社交电商发展趋势如何?
2020年日历表都有哪些节日?:2020年日历表都有哪些节日?

No comments:

Post a Comment