@LeetCode刷题
题目
题目链接:https://leetcode-cn.com/problems/4sum/
一、实现思路
- 总体判断:已知数组是否为空,或元素个数小于4,不满足条件,则排序;
if nums is None or len(nums)<4:
return []
nums.sort()
- 局部判断:当前元素与上一个元素是否相等
# i处
if i>0 and nums[i]==nums[i-1]:
continue
# j处
if j>i+1 and nums[j]==nums[j-1]:
continue
- 局部进一步判断:如果前四个元素相加大于
target
则后面的值计算均会大于target
(数组已排序),则break;如果前面的元素与从后往前的元素相加小于target,说明当前确定的i
和j
对应的值过小,则continue;
# i处
if sum(nums[i:i+4])>target:
break
if nums[i]+nums[len_-3]+nums[len_-2]+nums[len_-1]<target:
continue
# j处
if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
break
if nums[i]+nums[j]+nums[len_-1]+nums[len_-2]<target:
continue
二、总体代码
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
if nums is None or len(nums)<4:
return []
nums.sort()
res = []
len_ = len(nums)
for i in range(0, len_-3):
if i>0 and nums[i]==nums[i-1]:
continue
if sum(nums[i:i+4])>target:
break
if nums[i]+nums[len_-3]+nums[len_-2]+nums[len_-1]<target:
continue
for j in range(i+1, len_-2):
if j>i+1 and nums[j]==nums[j-1]:
continue
if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
break
if nums[i]+nums[j]+nums[len_-1]+nums[len_-2]<target:
continue
m, n, tot = j+1, len_-1, nums[i]+nums[j]
while m<n:
if tot+nums[m]+nums[n]==target:
res.append([nums[i], nums[j], nums[m], nums[n]])
while m<n and nums[m]==nums[m+1]:
m += 1
while m<n and nums[n]==nums[n-1]:
n -= 1
m += 1
n -= 1
elif tot+nums[m]+nums[n]>target:
n -= 1
else:
m += 1
return res
三、延申
使用Java写的时候,我卡在了List<Integer>
的初始化问题,在此记录:
//借鉴于 https://blog.csdn.net/qq_24562495/article/details/84837239
// 用到如下:
List<String> stringList = Arrays.asList("a", "b", "c");