my code:    time limited

 def threeSum(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def twoSum(a,b,c):
if a + b + c == 0:
return True
else:
return False res = []
for i in range(len(nums)-2):
a = nums[i]
for j in range(i+1,len(nums)-1):
b = nums[j]
k = j +1
#print(i,j,k,a,b,nums[k])
while k < len(nums):
print(a,b,nums[k])
if twoSum(a,b,nums[k]) :
print('....',a,b,nums[k])
temp = [a,b,nums[k]]
temp.sort()
print('...temp',temp)
if temp not in res:
res.append(temp)
print('....res',res)
k += 1
return res

思路:

1、时间复杂度n*n

排序 ( WT1:为什么要排序?)-》构建字典记录value:次数-》两层循环,其中不断不判断第三个数是不是也等于两层循环的值(用到dic的记录次数)

 class Solution(object):

     '''
O(n^2)时间复杂度 '''
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
num_cnt_dict = {} for num in nums:
num_cnt_dict[num] = num_cnt_dict.get(num, 0) + 1 if 0 in num_cnt_dict and num_cnt_dict[0] >= 3:
result.append([0, 0, 0]) nums = sorted(list(num_cnt_dict.keys())) for i, num in enumerate(nums):
for j in nums[i+1:]:
if num * 2 + j == 0 and num_cnt_dict[num] >=2:
result.append([num, num, j])
if j * 2 + num == 0 and num_cnt_dict[j] >= 2:
result.append([j, j, num]) diff = 0 - num - j
if diff > j and diff in num_cnt_dict:
result.append([num, j, diff])
return result

注意,以下的方式就会超时,可能是因为list和dict.keys()的检索查找方式不同

                if diff > b and diff in nums:  #要注意>b,才能不和前面的if重合
res.append([a,b,diff])
return res

2、n*m 其中n+m=len(nums)

构建dict -》 不排序,将dic的keys分为正数和负数-》两层for循环

注意下面这一行:是因为filter得到的是有序递增数列!!!!!!!所以当diff小于a时,说明当i=diff时候,由于不满足这个条件,还没有把[a,b,diff]放入最后结果

if diff<a or diff>b:
   res.append([a,b,diff])
 class Solution(object):

     '''
O(n^2)时间复杂度 '''
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
dic = {}
for item in nums:
dic[item] = dic.get(item,0) + 1
if 0 in dic and dic[0] >= 3:
res.append([0,0,0]) #为什么这个要单独列出来 -》因为除了这种情况,for循环中不会再出现三个数相等且和为0的情况
#nums = sorted(list(dic.keys()))
neg = list(filter(lambda x:x<0,dic.keys()))
pos = list(filter(lambda x:x>=0,dic.keys()))
for a in neg:
for b in pos:#为什么j的有边界不是len(nums)-1 -》因为可能会存在第三个数巧合和nums[j]相等
diff = 0 - a - b
if diff in dic:
if diff in (a,b) and dic[diff] >= 2:
res.append([a,b,diff])
if diff<a or diff>b:
res.append([a,b,diff])
return res

leetcode-mid-array-31 three sum-NO的更多相关文章

  1. [LeetCode] Split Array with Equal Sum 分割数组成和相同的子数组

    Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...

  2. Leetcode: Split Array Largest Sum

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  3. [LeetCode] Split Array With Same Average 分割数组成相同平均值的小数组

    In a given integer array A, we must move every element of A to either list B or list C. (B and C ini ...

  4. leetcode 数组array

    120. Triangle 给出一个三角形(数据数组),找出从上往下的最小路径和.每一步只能移动到下一行中的相邻结点上. 解法,自底向上 The idea is simple. Go from bot ...

  5. [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  6. 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)

    转自  http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...

  7. C++ STL@ list 应用 (leetcode: Rotate Array)

    STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...

  8. [leetcode]364. Nested List Weight Sum II嵌套列表加权和II

    Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...

  9. Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...

  10. LeetCode(113) Path Sum II

    题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given ...

随机推荐

  1. gRPC go安装教程

    安装protobuf go get -u github.com/golang/protobuf/proto go get -u github.com/golang/protobuf/protoc-ge ...

  2. js实现404页面倒计时跳转

    <script type="text/javascript"> (function(){ var i=5,timer=null,number=document.getE ...

  3. 权限控制(vue)

    权限控制(vue) 经常会遇到,角色权限控制问题,若是页面控制,倒好说,可如果是当前页面部分可见不可见,这就有些麻烦,如果加上条件就更加苛刻.之前只是简单的v-if进行控制,如今想试试指令(网上一直有 ...

  4. git init error:Malformed value for push.default: simple

    git init error:Malformed value for push.default: simple 1.git config --global push.default matching

  5. SpringBoot 单元测试忽略@component注解

    springboot框架在单元测试时可能需要忽略某些带有@component的实例 例如以下代码: @Component public class MyCommandLineRunner implem ...

  6. Django模板层2

    一.单表操作 1.1 开启test from django.test import TestCase import os # Create your tests here. if __name__ = ...

  7. SolrCloud集群

    1 SolrCloud简介 1.1什么是SolrCloud SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud. ...

  8. Linux下用命令查看CPU ID以及厂家等信息

    Linux下用命令查看CPU ID // 获得CPU IDdmidecode -t 4 | grep ID |sort -u |awk -F': ' '{print $2}' // 获得磁盘IDfdi ...

  9. 神经风格转换Neural Style Transfer a review

    原文:http://mp.weixin.qq.com/s/t_jknoYuyAM9fu6CI8OdNw 作者:Yongcheng Jing 等 机器之心编译 风格迁移是近来人工智能领域内的一个热门研究 ...

  10. get请求和post请求参数中文乱码的解决办法

    get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...