for i in range(n-2): x=nums[i] if i>0 and nums[i-1]==x: continue l=i+1 k=n-1 while l<k: tmp=x+nums[l]+nums[k] if tmp==0: ans.append([x,nums[l],nums[k]]) l+=1 k-=1 while l<k and nums[l]==nums[l-1]: l+=1 while l<k and nums[k]==nums[k+1]: k-=1 elif tmp>0: k-=1 else: l+=1 return ans
核心就是不能重复,i l k 都要判断一次,另外还有两处优化没写,分别是 i 和它紧接着的两个如果都大于零就可以直接 break 出去了,还有一个是 i 和最后两个加起来小于 0 就可以 continue 了
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: n=len(nums) ans=n+1 l=0 tmp=0 for i in range(n): tmp+=nums[i] while tmp>=target: tmp-=nums[l] ans=min(ans,i-l+1) l+=1 return ans if ans<=n else 0
class Solution: def trap(self, height: List[int]) -> int: n = len(height) fi=[0]*n fi[0]=height[0] for i in range(1,n): fi[i]=max(height[i],fi[i-1]) we=[0]*n we[-1]=height[-1] for i in range(n-2,-1,-1): we[i]=max(height[i],we[i+1]) ans=0 for i,j,k in zip(fi,we,height): ans+=min(j,i)-k return ans