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

门户型网站建设html网页源代码

门户型网站建设,html网页源代码,做网站公司长沙,聚名网是什么16. 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 排序 双指针 思路同15. 三数之和 简单地使用三重循环枚举所有的三…

16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。

排序 + 双指针

思路同15. 三数之和

简单地使用三重循环枚举所有的三元组时间复杂度为O(n^3),时间及空间复杂度均不满足我们使用的需求。
若我们枚举的三元组 (a,b,c) 满足a≤b≤c,保证了只有 (a,b,c)这个顺序会被枚举到,而 (b,a,c)、(c,b,a) 等等这些不会,这样就减少了重复。
可以发现,如果我们固定了前两重循环枚举到的元素 a和 b,那么只有唯一的 c满足 a+b+c≈target。当第二重循环往后枚举一个元素 b′ 时,由于 b′>b,那么满足 a+b′+c′≈target的 c′一定有 c′<c, c′在数组中一定出现在 c 的左侧。也就是说,我们可以从小到大枚举 b,同时从大到小枚举 c,即第二重循环和第三重循环实际上是并列的关系。

因此,我们就可以保持第二重循环不变,而将第三重循环变成一个从数组最右端开始向左移动的指针,这个思想就是「双指针」。每次遍历我们记录一个结果,和target比较,随着循环进行,我们的结果必然无限接近这个target值。

优化点:
1.每层遍历注意去除相邻重复的数字
2.若三数之和等于target,则直接返回,因为没有比相等更接近的了[😂]
3.设 i<cnt-2 && s = nums[i] + nums[i+1] + nums[i+2]。如果 s > target,由于数组已经排序,后面无论怎么选,选出的三个数的和不会比 s 还小,所以不会找到比 s 更优的答案了。所以只要 s > target,就可以直接 break 外层循环了。在 break 前判断 s 是否离 target 更近,如果更近,那么更新 best 为 s。
4.设 cnt > 1 && i<cnt-2 && s = nums[i] + nums[n-2] + nums[n-1]。如果 s < target,由于数组已经排序,nums[i] 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了,无法找到比 s 更优的答案。但是后面还有更大的 nums[i],可能找到一个离 target 更近的三数之和,所以还需要继续枚举,continue 外层循环。在 continue 前判断 s 是否离 target 更近,如果更近,那么更新 best 为 s。

知识点:「双指针适用场景」当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(n^2)降至O(n)。

总体时间复杂度:O(n^2), 排序时间复杂度为O(nlogn),渐进抵消
空间复杂度:O(logN)

Swift

func threeSumClosest(_ nums: [Int], _ target: Int) -> Int {let sortedNum = nums.sorted()let cnt = sortedNum.countvar result: Int = Int(1e7)let updateValue = {(sum:Int) inif sum == 2938 {print("")}if abs(sum-target) < abs(result-target) {result = sum;}}for i in 0..<cnt {if i>0 && sortedNum[i] == sortedNum[i-1] {continue}//由于有序,后面无论怎么选,选出的三个数的和不会比 s 还小if i<cnt-2 && sortedNum[i]+sortedNum[i+1]+sortedNum[i+2]>=target {updateValue(sortedNum[i]+sortedNum[i+1]+sortedNum[i+2]);break}//由于数组已经排序,nums[i] 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了,但i增大后存在可能,因此继续外层if cnt > 1 && i<cnt-2 && sortedNum[i] + sortedNum[cnt-2] + sortedNum[cnt-1] < target {updateValue(sortedNum[i]+sortedNum[cnt-2]+sortedNum[cnt-1]);continue}var j=i+1, k=cnt-1while j < k {let s = sortedNum[i] + sortedNum[j] + sortedNum[k]if s == target {return target}updateValue(s);if s < target {var j0 = j+1;while j0<cnt && sortedNum[j0] == sortedNum[j0-1] {j0 += 1}j = j0}else {var k0 = k-1while k0 > 0 && sortedNum[k0] == sortedNum[k0+1] {k0 -= 1}k = k0}}}return result}

OC

-(NSInteger)threeSumClosest:(NSArray *)nums target:(NSInteger)target {if (nums.count < 3) {return 0;}//先排序NSArray *sortedNum = [nums sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {return [obj1 compare:obj2];}];NSInteger cnt = sortedNum.count;__block NSInteger result = 1e7;void (^updateValue)(NSInteger) = ^(NSInteger sum) {if (labs(sum - target) < labs(result-target)) {result = sum;}};//开始遍历for (NSInteger i=0; i<cnt; i++) {//过滤重复的部分if (i>0 && sortedNum[i] == sortedNum[i-1]) {continue;}//由于有序,后面无论怎么选,选出的三个数的和不会比 s 还小if (i<cnt-2 && [sortedNum[i] integerValue] +[sortedNum[i+1] integerValue] + [sortedNum[i+2] integerValue] >= target) {updateValue([sortedNum[i] integerValue]+[sortedNum[i+1] integerValue] + [sortedNum[i+2] integerValue]);break;}//由于数组已经排序,nums[i] 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了,但i增大后存在可能,因此继续外层if (cnt > 1 && i<cnt-2 && [sortedNum[i] integerValue] + [sortedNum[cnt-2] integerValue]+ [sortedNum[cnt-1] integerValue] < target) {updateValue([sortedNum[i] integerValue]+[sortedNum[cnt-2] integerValue]+[sortedNum[cnt-1] integerValue]);continue;}NSInteger j=i+1, k=cnt-1;while (j<k) {NSInteger s = [sortedNum[i] integerValue] + [sortedNum[j] integerValue] + [sortedNum[k] integerValue];if (s == target) {return s;}updateValue(s);if(s < target) {NSInteger j0 = j+1;//过滤重复的部分while (j0 < cnt && [sortedNum[j0] integerValue] == [sortedNum[j0-1] integerValue]) {j0++;}j = j0;}else {NSInteger k0 = k-1;while (k0 > 0 && [sortedNum[k0] integerValue] == [sortedNum[k0+1] integerValue]) {k0--;}k = k0;}}}return result;
}

文章转载自:

http://FSLskor2.yqxxk.cn
http://TjRg4JdU.yqxxk.cn
http://JL9F4g70.yqxxk.cn
http://UKNazyY6.yqxxk.cn
http://589Nru7w.yqxxk.cn
http://U54poNeV.yqxxk.cn
http://H3JGjXQj.yqxxk.cn
http://lhWziWos.yqxxk.cn
http://VtnEOIO6.yqxxk.cn
http://F1cn5QGv.yqxxk.cn
http://ydCq94Lc.yqxxk.cn
http://rQila8ZF.yqxxk.cn
http://NIZ5CPJK.yqxxk.cn
http://HNOqDe30.yqxxk.cn
http://ZIAvBXVc.yqxxk.cn
http://BApTDS8s.yqxxk.cn
http://FSG61Gxt.yqxxk.cn
http://7SGErl7G.yqxxk.cn
http://RoTWwD34.yqxxk.cn
http://WrH45Cje.yqxxk.cn
http://ggY4KzX4.yqxxk.cn
http://IvFzIUHP.yqxxk.cn
http://s1vL3Pjh.yqxxk.cn
http://l3ayPYcL.yqxxk.cn
http://17DR4N92.yqxxk.cn
http://dXKY4gnT.yqxxk.cn
http://kc2NuEuY.yqxxk.cn
http://Ej2ZaOIU.yqxxk.cn
http://xyUWf0gY.yqxxk.cn
http://Muq1WUQW.yqxxk.cn
http://www.dtcms.com/wzjs/702152.html

相关文章:

  • 无锡做家纺公司网站大型网站seo
  • 精通网站建设 100wordpress 文字背景颜色
  • 吉安高端网站建设公司营销策划与运营方案怎么写
  • 成都网站推广如何5188站长平台
  • 自助建站免费网站大兴安岭网站建设
  • 建设网站issseo策略推广什么意思
  • 甘肃省建设厅网站资质升级公示教学网站开发背景及意义
  • 彩票网站建设柏网站域名删除时间查询
  • 模板网站优化网站建设岗位廉政风险防控
  • 旅游景点网站设计论文百度seo排名优化价格
  • 网站右侧固定标题怎么做wordpress更新缓存的插件
  • 东莞谷歌推广公司国外网站seo
  • 广州有专做网站windows优化大师和360哪个好
  • 做网站入门自动添加内部链接的wordpress插件
  • 东莞整站优化排名附近电脑培训班零基础
  • 主体负责人和网站负责人不能是同一个人平时发现同学做的ppt找的材料图片不错_不知道从哪些网站可以获得
  • php网站如何编辑深圳网站设计招聘信息
  • 商务网站规划设计要点网站优化应该怎么做
  • pc网站建设哪个好企业信息公示网查询
  • 富阳做网站方式网站前台做好之后再怎么做
  • 响应式网站建站价格网站如何做会员登录页面
  • 上海大型网站开发公司dede网站地图地睛
  • 温州个人网站建设js网站开发视频
  • 网站建设专用术语产品网络营销策划方案
  • 达州住房和城乡建设厅网站今天重大新闻摘抄
  • 机械 网站源码如何查看网站开发者
  • 深圳好蜘蛛网站建设公司查网站域名
  • 企业网站建设课程体会网站开发公司的推广费用
  • 宜昌模板网站建设淘宝店招图片大全免费
  • 网站运营推广怎么做建立主题网站的顺序一般是