双指针-15. 三数之和
文章目录
- 1.题解
- 2.机考代码
- 3.知识点讲解
- 1.res.add(Arrays.asList(nums[i], nums[l], nums[r]));
- 2.Arrays常用方法
- 大厂机考 / 算法题里 Arrays 只需要掌握这 5 个
- 1. Arrays.sort(nums) —— 排序(最常用)
- 2. Arrays.toString(nums) —— 打印数组
- 3. Arrays.asList(...) —— 快速生成 List
- 4. Arrays.binarySearch(nums, target) —— 二分查找
- 5. Arrays.copyOf(nums, newLength) —— 数组复制
- 极简总结(背这个就行)
力扣地址: 中等:15. 三数之和
1.题解
classSolution{publicList<List<Integer>>threeSum(int[]nums){List<List<Integer>>res=newArrayList<>();Arrays.sort(nums);for(inti=0;i<nums.length;i++){if(i>0&&nums[i]==nums[i-1])continue;intl=i+1,r=nums.length-1;while(l<r){intsum=nums[i]+nums[l]+nums[r];if(sum==0){res.add(Arrays.asList(nums[i],nums[l],nums[r]));// 去重while(l<r&&nums[l]==nums[l+1])l++;while(l<r&&nums[r]==nums[r-1])r--;l++;r--;}elseif(sum<0)l++;elser--;}}returnres;}}2.机考代码
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.Scanner;publicclassMain{publicstaticList<List<Integer>>threeSum(int[]nums){List<List<Integer>>res=newArrayList<>();Arrays.sort(nums);for(inti=0;i<nums.length;i++){// 去重if(i>0&&nums[i]==nums[i-1])continue;intl=i+1,r=nums.length-1;while(l<r){intsum=nums[i]+nums[l]+nums[r];if(sum==0){res.add(Arrays.asList(nums[i],nums[l],nums[r]));// 去重while(l<r&&nums[l]==nums[l+1])l++;while(l<r&&nums[r]==nums[r-1])r--;l++;r--;}elseif(sum<0)l++;elser--;}}returnres;}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);// 输入格式:第一行输入数组长度,第二行输入数组元素intn=sc.nextInt();int[]nums=newint[n];for(inti=0;i<n;i++){nums[i]=sc.nextInt();}// 调用算法List<List<Integer>>result=threeSum(nums);// 输出结果(机考标准格式)for(List<Integer>list:result){System.out.println(list);}}}3.知识点讲解
1.res.add(Arrays.asList(nums[i], nums[l], nums[r]));
Arrays.asList(3,2,8):把这几个元素转成List2.Arrays常用方法
大厂机考 / 算法题里 Arrays 只需要掌握这 5 个
其他都不用记,算法里几乎用不到。
1. Arrays.sort(nums) —— 排序(最常用)
作用:对数组从小到大排序。
场景:
- 两数之和、三数之和、四数之和
- 贪心、双指针、去重
int[]nums={-1,0,1,2};Arrays.sort(nums);// 结果:[-1, 0, 1, 2]2. Arrays.toString(nums) —— 打印数组
作用:把数组变成好看的字符串,方便调试/输出。
直接打印数组名是地址,必须用这个。
int[]a={1,2,3};System.out.println(Arrays.toString(a));// 输出:[1, 2, 3]3. Arrays.asList(…) —— 快速生成 List
作用:把几个元素 / 数组转成 List。
你三数之和那题就在用。
List<Integer>list=Arrays.asList(1,2,3);// 你那题写法:res.add(Arrays.asList(nums[i],nums[l],nums[r]));注意:
返回的 List不能 add/remove,但算法题只用来存结果,完全够用。
4. Arrays.binarySearch(nums, target) —— 二分查找
作用:在已排序数组中找 target,返回下标。
找不到返回负数。
intidx=Arrays.binarySearch(nums,5);5. Arrays.copyOf(nums, newLength) —— 数组复制
作用:复制一个新数组。
场景:不想修改原数组时。
int[]newArr=Arrays.copyOf(nums,nums.length);极简总结(背这个就行)
- 排序:
Arrays.sort(nums) - 打印:
Arrays.toString(nums) - 转List:
Arrays.asList(a,b,c) - 二分:
Arrays.binarySearch - 复制:
Arrays.copyOf
机考/算法题 99% 只用这 5 个,其他方法一律不用看。
