Leetcode-D37-数组-16. 最接近的三数之和&18. 四数之和

一、复习

11、盛最多水的容器
只有短的变化,面积才可能变大,从都到尾遍历所有短的变化的情况。
15、三数之和
(1)注意三个数如何分配:遍历哪个,哪两个是双指针。
(2)删除重复情况

二、16. 最接近的三数之和

1、这题和三数之和差不多啊,应该是多记录一个min值,而且不用排除重复情况。
2、这样写居然超时了

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        res = nums[0]+nums[1]+nums[2]
        for i in range(n):
            p = i+1
            q = n-1
            while(p<q):
                res = min(res,target - nums[i]-nums[p]-nums[q])
        return res

3、上面死循环了鹅鹅鹅,没带脑子。下面先排序,然后比较大小关系试一下。思路大体上和15题三数求和是一致的。

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        nums.sort()
        res_min = abs(target-nums[0]-nums[1]-nums[2])
        res = nums[0]+nums[1]+nums[2]
        for i in range(n):
            p = i+1
            q = n-1
            while(p<q):
                res_min = min(res_min,abs(target - nums[i]-nums[p]-nums[q]))
                if res_min==abs(target - nums[i]-nums[p]-nums[q]):
                    res = nums[i]+nums[p]+nums[q]
                if target - nums[i]-nums[p]-nums[q]>0:
                    p +=1
                elif  target - nums[i]-nums[p]-nums[q]<0:
                    q -= 1
                else:
                    return target
        return res

Leetcode-D37-数组-16. 最接近的三数之和&18. 四数之和_第1张图片

三、18. 四数之和

1、感觉有点像三数之和,不过,四数之和会不会更麻烦呢???我想试试两个双指针。
2、把三数之和改了改直接通过了,就是两个双指针。

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        n = len(nums)
        if n<4:
            return []
        nums.sort()
        res = []
        for i in range(n):
            if i!=0 and nums[i-1]==nums[i]:
                continue
            for j in range(n-1,i+2,-1):
                if j!=n-1 and nums[j+1] == nums[j]:
                    continue
                p = i+1
                q = j-1
                while(p<q):
                    if nums[i]+nums[p]+nums[q]+nums[j]==target:
                        res.append([nums[i],nums[p],nums[q],nums[j]])
                        while (p<q and nums[p+1]==nums[p]):
                            p += 1
                        while (p<q and nums[q-1]==nums[q]):
                            q -= 1
                        p += 1
                        q -= 1
                    elif nums[i]+nums[p]+nums[q]+nums[j]>target:
                        q -= 1
                    else:
                        p += 1 
        return res

Leetcode-D37-数组-16. 最接近的三数之和&18. 四数之和_第2张图片
3、看一下别人怎么写的
高赞答案是固定住左边的两个值进行遍历,复杂度是O(n3)。
我算算我的复杂度,好像只有O(n2)

你可能感兴趣的:(数据结构,数据结构-数组,python,leetcode,算法,职场和发展)