leetcode第16题

简介: 受到上一题的启发,没有看的,推荐大家可以看一下。我们完全可以先将数组排序,然后先固定一个数字,然后利用头尾两个指针进行遍历,降低一个 O(n)的时间复杂度。如果 sum 大于 target 就减小右指针,反之,就增加左指针。

image.png

top16

上一道题很类似,只不过这个是给一个目标值,找三个数,使得他们的和最接近目标值。

解法一 暴力解法

遍历所有的情况,然后求出三个数的和,和目标值进行比较,选取差值最小的即可。本以为时间复杂度太大了,神奇的是,竟然 AC 了。

publicintthreeSumClosest(int[] nums, inttarget) {
intsub=Integer.MAX_VALUE; //保存和 target 的差值intsum=0; //保存当前最接近 target 的三个数的和for (inti=0; i<nums.length; i++) {
for (intj=i+1; j<nums.length; j++)
for (intk=j+1; k<nums.length; k++) {
if (Math.abs((nums[i] +nums[j] +nums[k] -target)) <sub) {
sum=nums[i] +nums[j] +nums[k];
sub=Math.abs(sum-target);
                }
            }
    }
returnsum;
}

时间复杂度:O(n³),三层循环。

空间复杂度:O(1),常数个。

解法二

受到上一题的启发,没有看的,推荐大家可以看一下。我们完全可以先将数组排序,然后先固定一个数字,然后利用头尾两个指针进行遍历,降低一个 O(n)的时间复杂度。

如果 sum 大于 target 就减小右指针,反之,就增加左指针。

publicintthreeSumClosest(int[] nums, inttarget) {
Arrays.sort(nums);
intsub=Integer.MAX_VALUE;
intsum=0;
for(inti=0;i<nums.length;i++){ 
intlo=i+1,hi=nums.length-1;
while(lo<hi){
if(Math.abs((nums[lo]+nums[hi]+nums[i]-target))<sub){
sum=nums[lo]+nums[hi]+nums[i];
sub=Math.abs(sum-target);
            }
if(nums[lo]+nums[hi]+nums[i]>target){
hi--;
            }else{
lo++;
            }
        }
    }
returnsum;
}

时间复杂度:如果是快速排序的 O(log_n)O(logn) 再加上 O(n²),所以就是 O(n²)。

空间复杂度:O(1)。

和上一道题非常非常的相似了,先对数组排序,然后利用两头的指针,可以说是十分的优雅了。


相关文章
|
5月前
|
Java
leetcode-474:一和零
leetcode-474:一和零
38 0
|
5月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
单链表反转 LeetCode 206
单链表反转 LeetCode 206
73 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
72 0
|
Python
LeetCode 1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
101 0
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
70 0
|
算法 Python
LeetCode 386. Lexicographical Numbers
给定一个整数 n, 返回从 1 到 n 的字典顺序。
78 0
LeetCode 386. Lexicographical Numbers
|
C++ Python
LeetCode 771. Jewels and Stones
LeetCode 771. Jewels and Stones
77 0
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
150 0
leetcode第49题