当前位置: 首页 > news >正文

【Swift】LeetCode 15. 三数之和

15. 三数之和

在这里插入图片描述

题目描述

请添加图片描述

思路 and Swift 题解

同样是经典的双指针问题。首先,我们需要对输入的数组排序,由于数组的类型是[Int],它遵循Sequence协议,因此直接使用内置的sorted()方法即可。

需要注意的是,在 Swift 当中,所有函数的参数默认都是常量,除非显式指定形参的类型为inout,所以此处我们修改形参名为anums,并使用var nums = anums.sorted()来获取排序后的数组。

为什么需要进行排序?因为我们需要在有序序列上使用双指针。首先,我们需要对排序后的数组进行遍历,由于我们求的是三数之和,理想情况下一个可能的答案是数组的最后三个数字,后两个数需要使用双指针来找到,因此遍历时,我们只需要遍历到nums.count - 3这个位置即可。此处需要引出一个 Swift for 循环当中的一个关键知识点,那就是如何对数组进行“范围遍历”。在 Swift 3.0+ 当中已经废弃了 C 风格的循环,也就是不能使用for (_; _; _) 来进行遍历,而应该使用for i in 0..<nums.count - 2进行遍历。

在 Swift 当中,a...b(三个点)标识了一个闭区间,如果使用a..<b(两个点,第三个点被<替代),那就是一个左闭右开区间(此处的 a 和 b 都是整型)。以1...3为例,使用var range = 1...3,得到的将是一个Range<Int>类型的变量,它不是数组,而是一个区间,但可以使用Array(range)Array(1..3)转为数组。除了在 for 循环当中作为循环边界之外,数组的切片当中也可以使用 Range。

现在回到这个问题上,我们对nums进行循环,每次取当前循环的数值nums[i]x。取jki + 1n - 1,在[i + 1, n - 1]这个范围内,我们需要寻找三个数值,满足x + nums[j] + nums[k] == 0。令sum = x + nums[j] + nums[k],如果sum > 0,说明右侧(数组已经升序排列了)的数值太大了,需要把右指针它向左调整以减小右侧的数值(k -= 1);反之如果sum < 0,则说明左侧的数值太小,左指针需要向右调整(j += 1)。如果sum == 0,说明此时找到了答案,记录[x, nums[j], nums[k]]到答案当中,并令j += 1; k -=1,继续寻找可能的答案(注意,可能会出现nums[j] == nums[j - 1]nums[k] == nums[k + 1],因此需要去重)。

完整的 Swift 题解如下,其中额外考虑了一些边界情况,一些是用作优化的,一些是用作找到答案后进行去重的:

class Solution {func threeSum(_ anums: [Int]) -> [[Int]] {var nums = anums.sorted()var n = nums.countvar ans: [[Int]] = []for i in 0..<n - 2 {var x = nums[i]if i > 0 && x == nums[i - 1] {continue}if x + nums[n - 1] + nums[n - 2] < 0 {continue}if x + nums[i + 1] + nums[i + 2] > 0 {break}var j = i + 1, k = n - 1while j < k {var sum = x + nums[j] + nums[k]if sum > 0 {k -= 1} else if sum < 0 {j += 1} else {ans.append([x, nums[j], nums[k]])j += 1; k -= 1while j < k && nums[j] == nums[j - 1] {j += 1}while j < k && nums[k] == nums[k + 1] {k -= 1}}}}return ans}
}
http://www.dtcms.com/a/475606.html

相关文章:

  • 做网站表格单边框标记南通建设局网站查询
  • 百度正版下载恢复百度莱阳seo排名
  • 利用AI工具生成毕业论文,并智能管理相关文献资源。
  • erp网站建设方案asp自动获取网站快照 网站缩略图
  • 做网站为什么要备案照相石家庄网站排名推广
  • 机器学习实践项目(一)- Rossman商店销售预测 - 模型训练
  • 200M电信宽带做网站济南品牌网站建设价格低
  • 没后台的网站怎么做优化博物馆设计公司排名
  • 西部数码域名备案seo技术导航
  • 做的网站没有手机版网站如何推广好
  • 用网站做淘宝客的人多吗会员管理系统免费版
  • 网站建设仟首选金手指制作企业网站的新闻
  • 上海网站建设百度推广公司哪家好wordpress文章在哪
  • 重庆云诚度网站建设关键词排名优化教程
  • seo移动网站页面怎么做怎么在网站里做网页
  • 公司网站建设为什么不直接买模版h5招聘模板免费
  • 360搜索怎么做网站优化seo一个关键词多少钱
  • 开平市城乡建设局网站搜索引擎营销的主要方法包括
  • 类与对象 -- 日期类实现
  • 网站一键生成wapwordpress模板安装
  • 新能源网站建设哪家好门户网站建设要多少钱
  • 网站风格 颜色搭配美橙网站建设经典案例
  • 网站功能建设特点广西壮族自治区市场监督管理局
  • 【Bean】条件装配与动态注册
  • 做厨具公司网站广州开发网站
  • 网站建设编程时注意事项网站设计开发制作
  • Python datetime 教程
  • 浙江做铁塔的公司网站漯河网页制作
  • windows8风格网站模板上海高端室内设计公司
  • 网站设计公司北京服务类网站免费建站