leetcode第18题

简介: top18和3Sum类似,只不过是找四个数,使得和为 target,并且不能有重复的序列。如果之前没有做过3Sum可以先看看,自己在上边的基础上加了一个循环而已。

image.png

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 的思路写的,比较好理解。


相关文章
|
8月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
45 0
|
索引
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
93 0
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题
leetcode第51题
较经典的回溯问题了,我们需要做的就是先在第一行放一个皇后,然后进入回溯,放下一行皇后的位置,一直走下去,如果已经放的皇后的数目等于 n 了,就加到最后的结果中。然后再回到上一行,变化皇后的位置,然后去找其他的解。 期间如果遇到当前行所有的位置都不能放皇后了,就再回到上一行,然后变化皇后的位置。再返回到下一行。 说起来可能还费力些,直接看代码吧。
leetcode第51题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
191 0
leetcode第49题