当前位置: 代码迷 >> 综合 >> 每天一道leetecode:18、四数之和(medium)
  详细解决方案

每天一道leetecode:18、四数之和(medium)

热度:48   发布时间:2023-12-14 15:04:10.0

这个题按照三数之和的思路继续进行。

设置四个指针:两个指针用于遍历,剩下的两个指针在这两个指针的后面前后走。

按照这个思路:

def fourSum(nums, target):for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[i] > nums[j]:k = nums[i]nums[i] = nums[j]nums[j] = kres = []for i in range(len(nums)):if i > 0 and nums[i] == nums[i-1]:continuefor j in range(i+1, len(nums)):if j - i > 1 and nums[j] == nums[j-1]:continueL = j + 1R = len(nums) - 1n1 = 100000n2 = 100000while L < R:if nums[i] + nums[j] + nums[L] + nums[R] == target:if n1 == nums[L] and n2 == nums[R]:L += 1R -= 1continueres.append([nums[i], nums[j], nums[L], nums[R]])n1 = nums[L]n2 = nums[R]L += 1R -= 1if nums[i] + nums[j] + nums[L] + nums[R] > target:R -= 1if nums[i] + nums[j] + nums[L] + nums[R] < target:L += 1return resnums = [-1,0,-5,-2,-2,-4,0,1,-2]print(fourSum(nums, -9))

 

第一点需要注意:

        if i > 0 and nums[i] == nums[i-1]:continue

 用于第一个数字不重复。

第二点需要注意:

            if j - i > 1 and nums[j] == nums[j-1]:continue

用于第二个数字不重复。

第三点需要注意:

            n1 = 100000n2 = 100000while L < R:if nums[i] + nums[j] + nums[L] + nums[R] == target:if n1 == nums[L] and n2 == nums[R]:L += 1R -= 1continue

保证后面两个指针++,--时不重复。

通过四个指针的数不重复,最后达到不出现重复现象。

时间复杂度(o^3)

昨天周六,去了北京香山逛了逛,下雨的天气,人还超级多,爬山很热很累,下山的时候鞋子太滑还摔了一跤,莫名感觉摔的很爽,哈哈哈哈哈哈......

附带一张香山图:

  相关解决方案