从零开始刷Leetcode——数组(11.15.16.18)
文章目录
- 11. 盛最多水的容器
- 15. 三数之和
- 16. 最接近的三数之和
- 18. 四数之和
前800题easy难度想做的已经做完了,之后是medium难度
11. 盛最多水的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
1.暴力法
class Solution {public int maxArea(int[] height) {if (height.length<2) {return 0;}int max = 0;for (int i =0;i<height.length-1;i++) {for (int j=i+1;j<height.length;j++) {int writer = (j-i)*Math.min(height[i],height[j]);max = Math.max(max,writer);}}return max;}
}
暴力法没做,贴个别人写的java,反正就是全遍历一遍取最大值。主要还是双指针法
2.双指针
class Solution:def maxArea(self, height: List[int]) -> int:left = 0right = len(height) -1max_value = 0while(left<right):max_value = max(max_value, (right-left)*min(height[left], height[right]))if height[left] < height[right]:left += 1else:right -= 1return max_value
具体原理写起来比较费事,贴一个我觉得讲的清楚的链接。leetcode链接,84ms,14.2MB
15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
1.排序+双指针
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()res = []length = len(nums)for i in range(length):if nums[i] > 0:return res#去重位置1if i>0 and nums[i] == nums[i-1]:continueleft = i+1right = length-1while(left<right):if nums[left] + nums[i] + nums[right] == 0:res.append([nums[left], nums[i], nums[right]])#去重位置2while(left<right and nums[left]==nums[left+1]):left=left+1while(left<right and nums[right]==nums[right-1]):right=right-1left += 1right -= 1elif nums[left] + nums[i] + nums[right] < 0:left += 1else:right -= 1return res
本题时间复杂度为O(n^2),所以可以先排序。线确定一个数后确定另两个数时解法类似第一题两数之和,需要注意的点是容易产生重复,上述代码有两个位置要进去去重操作。1316ms,16.2MB
16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
1.排序+双指针
class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()length = len(nums)sum_value = 0min_value = float(inf)for i in range(length-2):left = i+1right = length-1while(left<right):sum_value = nums[i]+nums[right]+nums[left]if abs(sum_value-target) < abs(min_value):min_value = sum_value-targetif sum_value<target:left += 1elif sum_value == target:return targetelse:right -= 1return min_value+target
和上面基本一模一样。148ms,13.7MB
18. 四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
1.排序+双指针
class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()length = len(nums)max_value = 0ans = []for i in range(length-3):if i>0 and nums[i] == nums[i-1]:continuefor j in range(i+1, length-2):if j > i+1 and nums[j] == nums[j-1]:continueleft = j+1right = length-1while(left<right):if nums[i]+nums[j]+nums[right]+nums[left] == target:ans.append([nums[i], nums[j], nums[left], nums[right]])while(left<right and nums[left]==nums[left+1]):left +=1while(left<right and nums[right]==nums[right-1]):right -= 1left +=1right -=1elif nums[i]+nums[j]+nums[right]+nums[left] < target:left += 1else:right -= 1return ans
依旧和上面差不多,虽然思路一样,但是可以在代码中添加限制条件进行continue、break或者直接return来加快运算速度,这里我没加。2184ms, 13.7MB。
从零开始刷Leetcode——数组(11.15.16.18)相关推荐
- 从零开始刷Leetcode——数组(896.905.914.922)
文章目录 896. 单调数列 905. 按奇偶排序数组 914. 卡牌分组 922. 按奇偶排序数组 II 896. 单调数列 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i &l ...
- 从零开始刷Leetcode——数组(532.561)
文章目录 532. 数组中的K-diff数对 561. 数组拆分 I 532. 数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-d ...
- 从零开始刷Leetcode——数组(189.217.219)
文章目录 189.旋转数组 217.存在重复元素 217.存在重复元素 II 189.旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 1.定义一个新数组 class ...
- 从零开始刷Leetcode——数组(122.167.169)
文章目录 122.买卖股票的最佳时机 II 167.两数之和II 169.多数元素 122.买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计 ...
- 从零开始刷Leetcode——数组(1.26)
文章目录 1.两数之和 26.删除排序数组中的重复项 马上要去读研了,作为一个转码的ee学生,刷题还是很必要的.从零开始,希望能坚持下去!打算按照类别和难度慢慢刷,一天两三道题左右,争取明年夏季找实习 ...
- 从零开始刷Leetcode——数组(941.977)
文章目录 941. 有效的山脉数组 977. 有序数组的平方 三级目录 941. 有效的山脉数组 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false. 让我们回顾一下, ...
- 从零开始刷Leetcode——数组(830.849.888)
文章目录 830. 较大分组的位置 849. 到最近的人的最大距离 888. 公平的糖果交换 830. 较大分组的位置 在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组. 例 ...
- 从零开始刷Leetcode——数组(697.717.724)
文章目录 697. 数组的度 717. 1比特与2比特字符 724. 寻找数组的中心索引 697. 数组的度 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数 ...
- 从零开始刷Leetcode——数组(581.605.628)
文章目录 581. 最短无序连续子数组 605.种花问题 628. 三个数的最大乘积 581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个 ...
最新文章
- 软考网络工程师身份证忘记领取啦怎么办
- 《计算机网络》常考概念、英文缩写、公式大全
- 揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%
- 编码区和非编码区的关系
- 函数ZwQuerySystemInformation小结
- 利用关系数据库开展智能化营销新思路详解
- OSPF第十章:OSPF 一
- android运行的线程中,android中线程是否运行在单独的进程中?
- echarts-formatter
- 在wamp集成环境中添加mysql操作记录
- 【NLP】Dive into BERT:语言模型与知识
- (一)【模电】(第一章 常用半导体器件)半导体基础知识
- Python的学习笔记案例4--52周存钱挑战1.0
- ESXi主机从6.7升级到ESXi 7.0.3后无法识别Emulex LPe12000 HBA卡
- 为什么csgo一直显示连接官方服务器失败,CSGO提示连接任意官方服务器失败怎么办?五大详细解决方法看这里!...
- html banner广告代码,jquery实现的Banner广告收缩效果代码
- 从容器中获取宿主机IP地址
- C# 操作Word——设置Word文档背景色(纯色、渐变色、图片背景色)
- X3D代码理解之demo(cfg)
- deepin+win10EFI分区删了/开机没有win的启动项解决方法
热门文章
- mybatis中#{}和${}
- VS2005发送电子邮件(转)
- 2016 中国大数据技术大会 相关资料
- ant编译mysql驱动
- 5.Struts2配置形式,覆盖
- ssh登录到esxi机器中后开关虚拟机
- 一个软件测试员的工作与学习(二)
- 也说 Jquery+ASP.NET 实现开心网上传头像剪裁功能
- wamp php 安装redis,wampServer的php安装Redis 扩展
- java连接mysql数据库 R,java连接MySql数据库!