【DW组队学习—LeetCode】day03
11. 盛最多水的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
【示例1】输入:[1,8,6,2,5,4,8,3,7] 输出:49
解释:图中垂直线代表输入数组[1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
【示例2】输入:height = [1,1] 输出:1
【示例3】输入:height = [4,3,2,1,4] 输出:16
【示例4】输入:height = [1,2,1] 输出:2
提示:
- n = height.length
- 2 <= n <= 3 * 104
- 0 <= height[i] <= 3 * 104
尝试思路:
遍历两个垂线之间的体积,同时记录当前出现的最大体积
代码:
class Solution:def maxArea(self, height: List[int]) -> int:v_max, v = 0, 0l = len(height)for i in range(l):for j in range(i+1,l):v = min(height[i],height[j]) * (j-i)v_max = max(v, v_max)return v_max
错误:运行超时
原因:遍历复杂度过高,耗费时间太长
暂时没想到别的方法
14. 最长公共前缀
题目要求
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
【示例 1】输入:strs = [“flower”,“flow”,“flight”] 输出:“fl”
【示例 2】输入:strs = [“dog”,“racecar”,“car”] 输出:""
解释:输入不存在公共前缀。
提示:
- 0 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
尝试思路1:
1、找到长度最短的元素,将其字符作为对比字符(得到列表中所有元素的长度列表,使用list.index(min)函数得到其索引,对应找到长度最短元素)
2、依次对比每个元素的每一位字符(以长度最短元素的字符作为对比字符)
2.1 如果与对比字符不同,则结束循环
2.2 如果均与对比字符相同,则计入公共序列
3、输出结果
测试中出现的未考虑到的案例:原始元素列表为空列表[]
代码:
class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:ps = "" #最长公共前缀if strs:list_l = [len(i) for i in strs] #记录列表元素长度s = strs[list_l.index(min(list_l))] #字符最少元素for i in range(len(s)):same = 0 #相同标识符,=0表示有不相同字符,=1表示相同for j in range(len(strs)):if strs[j][i] == s[i]:same = 1else:same = 0breakif same == 1:ps = ps + s[i]else:breakreturn ps
尝试思路2:
1、找到元素中最短元素的长度(步骤同上)
2、依次取每个元素的第i位组成集合(不包含重复元素),若集合长度为1,则所有元素的第i位相同,否则结束循环
3、输出结果
代码:
class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:ps = "" #最长公共前缀if strs:list_l = [len(i) for i in strs] #记录列表元素长度s = strs[list_l.index(min(list_l))] #字符最少元素for i in range(len(s)):set_c = set([strs[j][i] for j in range(len(strs))])if len(set_c) == 1:ps = ps + s[i]else:breakreturn ps
方法2耗时明显减少,但是内存一直不低
15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
【示例 1】输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
【示例 2】输入:nums = [] 输出:[]
【示例 3】输入:nums = [0] 输出:[]
提示:
- 0 <= nums.length <= 3000
- -105 <= nums[i] <= 105
尝试思路1:
1、判断nums里的元素个数,小于3直接输出空列表,否则继续步骤2
2、对nums进行排序(使用sort方法,没有返回值,直接修改原列表),三层循环,判断是否已经在现有列表里存在,若已存在则不再存入
3、输出结果
代码:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:result = []if len(nums) >= 3:nums.sort()for i in range(len(nums)):for j in range(i+1, len(nums)):for t in range(j+1, len(nums)):if (nums[i] + nums[j] + nums[t] == 0) and [nums[i], nums[j], nums[t]] not in result:result.append([nums[i], nums[j], nums[t]])return result
根据提交结果可知,在时间限制内,没有出错,但是复杂度还是很高,导致时间过长
尝试思路2:
1、判断nums里的元素个数,小于3直接输出空列表,否则继续步骤2
2、对nums进行排序,并使用pop方法在nums列表中依次取出两个数(a从原序列取,b从去a序列取,c从去ab序列取),然后计算需要的第三个数是什么,并判断是否在剩下列表中存在第三个数,若不存在则不计入,若存在判断是否已经有了该组合,若有了也不计入
3、输出结果
代码:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:result = []a, b, c = 0, 0, 0if len(nums) >= 3:nums.sort()for i in range(len(nums)):anums = numsa = anums.pop(i)for j in range(len(anums)):bnums = anumsb = bnums.pop(j)c = 0 - a - br = [a, b, c]r.sort()if (c in bnums) and (r not in result):result.append(r) return result
错误:索引超过范围
原因:“假赋值”,当删除中间商的某个元素时,一条等式链上的列表都会更新
解决方法:用copy.deepcopy(list)代替原赋值,解决了该错误,但仍存在运行超时问题
同时,采取remove方法取代pop方法
代码:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:result = []a, b, c = 0, 0, 0if len(nums) >= 3:nums.sort()anums = copy.deepcopy(nums)for a in anums:anums.remove(a)bnums = copy.deepcopy(anums)for b in bnums:bnums.remove(b)c = 0 - a - br = [a, b, c]r.sort()if (c in bnums) and (r not in result):result.append(r) return result
错误:少了一组答案
原因:没有理解for循环取值的原理,以为更新后会从头开始,实际上for循环按照索引进行取值,被循环列表更新后,仍是原来的索引,即原来索引为1的值在更新后索引变成了0,但for仍取新列表中索引为1的值,故而一些数据被跳过,导致答案缺失。所以应该一直用原序列做循环。
更改后代码:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:result = []a, b, c = 0, 0, 0if len(nums) >= 3:nums.sort()anums = copy.deepcopy(nums)for a in nums:anums.remove(a)bnums = copy.deepcopy(anums)for b in anums:bnums.remove(b)c = 0 - a - br = [a, b, c]r.sort()if (c in bnums) and (r not in result):result.append(r) return result
但仍超时,悲剧
【DW组队学习—LeetCode】day03相关推荐
- 【组队学习】【31期】LeetCode 刷题
LeetCode 刷题 航路开辟者:杨世超 领航员:刘军 航海士:杨世超.李彦鹏.叶志雄.赵子一 基本信息 开源内容:https://github.com/itcharge/LeetCode-Py 开 ...
- leetcode组队学习——查找(二)
文章目录 1.两数之和 15. 三数之和 16. 最接近的三数之和 18. 四数之和 454. 四数相加 II 49. 字母异位词分组 447. 回旋镖的数量 149. 直线上最多的点数 1.两数之和 ...
- leetcode组队学习——动态规划
文章目录 主要思想 模板步骤 例题 300. 最长上升子序列 674. 最长连续递增序列 5. 最长回文子串 516. 最长回文子序列 72. 编辑距离 198. 打家劫舍 213. 打家劫舍 II ...
- leetcode组队学习——查找(一)
文章目录 方法:考虑的基本数据结构 例题 202. 快乐数 205. 同构字符串 242. 有效的字母异位词 290. 单词规律 349. 两个数组的交集 350. 两个数组的交集 II 451. 根 ...
- 【组队学习】一月微信图文索引
一月微信图文索引 一.组队学习相关 周报: [新周报(049)]Datawhale组队学习 Datawhale组队学习周报(第048周) Datawhale组队学习周报(第047周) Datawhal ...
- 【组队学习】【34期】组队学习内容详情
第34期 Datawhale 组队学习活动马上就要开始啦! 02月09日(星期三),宣发,2月组队学习计划!. 02月12日(星期六),进入学习群.开营仪式. 本次组队学习的内容为: 阿里云天池在线编 ...
- 【新周报(050)】Datawhale组队学习
记录: 按照Datawhale第33期组队学习的规划,六门课程 <吃瓜教程--西瓜书+南瓜书>.<动手学数据分析>.<李宏毅机器学习(含深度学习)>.<数据可 ...
- Datawhale组队学习周报(第047周)
本周报总结了从 2021年01月03日至2022年01月09日,Datawhale组队学习的运行情况,我们一直秉承"与学习者一起成长的理念",希望这个活动能够让更多的学习者受益. ...
- 【组队学习】【32期】吃瓜教程——西瓜书+南瓜书
吃瓜教程--西瓜书+南瓜书 航路开辟者:谢文睿.秦州 领航员:陈伟峰 航海士:谢文睿.秦州 基本信息 开源内容:https://github.com/datawhalechina/pumpkin-bo ...
最新文章
- Juniper SSH防护
- feachall php_timthumb.php详解
- 学习招投标相关知识-编写标书
- 多对多的属性对应表如何做按照类别的多属性匹配搜索
- 利用var_export 写缓存配置
- Go map[int64]int64 写入 redis 占用多少内存
- OpenCv2 学习笔记(1) Mat创建、复制、释放
- 从0到1使用Kubernetes系列(四):搭建第一个应用程序
- 疫情中的2021,云原生会走向哪里
- js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...
- 两年ACM竞赛的所有算法总结
- Dropping Balls(小球下落)
- 赚钱只要找到方法,就如吸空气
- The mbstring extendsion is missing,Please check you PHP configuration
- Linux Kernel代码艺术——数组初始化
- mysql ping 长连接超时时间_mysql_ping与mysql长连接(部分摘录) | 学步园
- S2SH框架配置步骤
- 驾校一点通电脑版客户端 v7.1 最新PC版
- origin 去掉白边
- c# 使用谷歌身份验证GoogleAuthenticator的示例