题解 | #牛群的标签和#
牛群的标签和
https://www.nowcoder.com/practice/42ae88bedeb74da99813f6150769d07e
题目考察的知识点
考察双指针算法
题目解答方法的文字分析
数组排序后,使用双指针遍历,左右指针分别从前后遍历。双重遍历查找符合要求的四个数的组合。注意去重,细节参看代码实现即可。
本题解析所用的编程语言
使用Java解答
完整且正确的编程代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型二维数组
*/
public int[][] fourSum (int[] nums, int target) {
// write code here
List<List<Integer>> res = new ArrayList();
Arrays.sort(nums);
for(int i=0; i<nums.length-3; i++){
if(i>0&&nums[i]==nums[i-1]) continue; // 去重
for(int j=i+1;j<nums.length-2; j++){
// 同样去重
if(j>i+1&&nums[j]==nums[j-1]) continue;
int left = j+1,right = nums.length-1;
while(left<right){
//int tag = target - nums[i] - nums[j];
if((long)nums[left] + nums[right] + nums[i] + nums[j] >target){
right--;
}else if((long)nums[left]+nums[right]+nums[i] + nums[j]<target){
left++;
}else{
ArrayList<Integer> temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[left]);
temp.add(nums[right]);
res.add(new ArrayList(temp));
while(left<right&&nums[left]==nums[left+1]){
left++;
}
while(left<right&&nums[right]==nums[right-1]){
right--;
}
left++;
right--;
}
}
}
}
if(res.size()==0) return new int[][]{};
int[][] ret = new int[res.size()][res.get(0).size()];
for(int i=0; i<res.size(); i++){
for(int j=0; j<res.get(0).size(); j++){
ret[i][j] = res.get(i).get(j);
}
}
return ret;
}
}
快手成长空间 767人发布

