leetcode-mid-array-31 three sum-NO
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的更多相关文章
- [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 ...
- Leetcode: Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- [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 ...
- leetcode 数组array
120. Triangle 给出一个三角形(数据数组),找出从上往下的最小路径和.每一步只能移动到下一行中的相邻结点上. 解法,自底向上 The idea is simple. Go from bot ...
- [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 ...
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- C++ STL@ list 应用 (leetcode: Rotate Array)
STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...
- [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. ...
- Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)
Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...
- 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 ...
随机推荐
- IntelliJ IDEA 部署 Web 项目,终于搞懂了!
这篇牛逼: IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行. 最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse,为了 ...
- java基础笔记(4)
二进制运算: &的应用:清零.得到指定位的数: |的应用:将指定位置取1: ^的应用:取反.保留原值:交换两个bian变量:A= A^B,B =A ^ B,A = A^B;(原理就是本身异或本 ...
- N皇后问题(递归)
//八皇后递归解法 //#include<iostream> //using namespace std; #include<stdio.h> ] = {-,-,-,-,-,- ...
- 解决intellij idea控制台中文乱码
乱码原因: 1.系统语言:英文 英文系统下遇到乱码问题,分析了程序执行参数如下: ps -ef | grep java 执行后得到如下的结果,省略了classpath: /System/Library ...
- div和span互换
div是块级元素,它不论大小默认占一行,而且可以设置宽高以及外边距span是行内元素,它占它自身大小的位置,而且不能设置宽高以及边距同时div也可以变为span (display:inline),这样 ...
- k3 cloud中员工离职以后释放站点
进入金蝶云企业平台:https://cloud.kingdee.com/qy,找到对应的用户并选择离职 给替代的员工加上专业应用组: 客户端也加上分组并且同步注册用户 管理中心更新用户许可:
- k3 cloud中单据体中文本自适应
在单据体中添加多行文本,然后设置本地配置,只读单元格自动换行
- js中的数组去掉空值
//result 是有空值的数组//r是处理好的数组var r = result.filter(function (s) { return s && s.trim();});
- 史上最全Java学习视频下载地址分享
http://blog.csdn.net/xlgen157387/article/details/39735141
- 如何设置一个App的缓存机制
在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个 ...