top18
和3Sum类似,只不过是找四个数,使得和为 target,并且不能有重复的序列。
如果之前没有做过3Sum可以先看看,自己在上边的基础上加了一个循环而已。
publicList<List<Integer>>fourSum(int[] num, inttarget) { Arrays.sort(num); List<List<Integer>>res=newLinkedList<>(); //多加了层循环for (intj=0; j<num.length-3; j++) { //防止重复的if (j==0|| (j>0&&num[j] !=num[j-1])) for (inti=j+1; i<num.length-2; i++) { //防止重复的,不再是 i == 0 ,因为 i 从 j + 1 开始if (i==j+1||num[i] !=num[i-1]) { intlo=i+1, hi=num.length-1, sum=target-num[j] -num[i]; while (lo<hi) { if (num[lo] +num[hi] ==sum) { res.add(Arrays.asList(num[j], num[i], num[lo], num[hi])); while (lo<hi&&num[lo] ==num[lo+1]) lo++; while (lo<hi&&num[hi] ==num[hi-1]) hi--; lo++; hi--; } elseif (num[lo] +num[hi] <sum) lo++; elsehi--; } } } } returnres; }
时间复杂度:O(n³)。
空间复杂度:O(N),最坏情况,即 N 是指 n 个元素的排列组合个数,即 N=C^4_nN=Cn4,用来保存结果。
总
完全是按照 3Sum 的思路写的,比较好理解。