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

重庆招聘网站建设手机网站有什么要求

重庆招聘网站建设,手机网站有什么要求,linux软件开发,1小时赚8000元游戏15. 三数之和 题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意:**答…

15. 三数之和

题目:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例:

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

解题:

方法一:排序+双指针

这道题相较于两数之和多了去重的部分,所以不适合使用哈希法来解题,而这道题不要求返回下标,所以可以考虑对数组进行排序。

去重逻辑的思考
a的去重

说到去重,其实主要考虑三个数的去重。 a, b ,c, 对应的就是 nums[i],nums[left],nums[right]

a 如果重复了怎么办,a 是 nums 里遍历的元素,那么应该直接跳过去。

但这里有一个问题,是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同。这其实不一样如果我们的写法是 这样:

/*那我们就把 三元组中出现重复元素的情况直接pass掉了。 例如 {-1, -1 ,2} 这组数据,当遍历到第一个 -1 的时候,判断 下一个也是 -1,那这组数据就 pass 了。*/
if (nums[i] == nums[i + 1]) { // 去重操作continue;
}

我们要做的是 不能有重复的三元组,但三元组内的元素是可以重复的!

所以这里是有两个重复的维度。

那么应该这么写:

/*这么写就是当前使用 nums[i],我们判断前一位是不是一样的元素,在看 {-1, -1 ,2} 这组数据,当遍历到 第一个 -1 的时候,只要前一位没有 -1,那么 {-1, -1 ,2} 这组数据一样可以收录到 结果集里。*/
if (i > 0 && nums[i] == nums[i - 1]) {continue;
}
b与c的去重

如果去重的逻辑多加了对 right 和left 的去重:(代码中注释部分)

while (right > left) {if (nums[i] + nums[left] + nums[right] > 0) {right--;// 去重 rightwhile (left < right && nums[right] == nums[right + 1]) right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;// 去重 leftwhile (left < right && nums[left] == nums[left - 1]) left++;} else {}
}

但细想一下,这种去重其实对提升程序运行效率是没有帮助的。

拿 right 去重为例,即使不加这个去重逻辑,依然根据 while (right > left)if (nums[i] + nums[left] + nums[right] > 0) 去完成 right-- 的操作。

多加了 while (left < right && nums[right] == nums[right + 1]) right--; 这一行代码,其实就是把 需要执行的逻辑提前执行了,但并没有减少 判断的逻辑。

最直白的思考过程,就是 right 还是一个数一个数的减下去的,所以在哪里减的都是一样的。

所以这种去重是可以不加的。 仅仅是把去重的逻辑提前了而已。

代码实现:
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}// 错误去重a方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*/// 正确去重a方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) right--;else if (nums[i] + nums[left] + nums[right] < 0) left++;else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重逻辑应该放在找到一个三元组之后,对 b 和 c 去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}return result;}
};

复杂度分析

  • 时间复杂度:O(N2),其中 N 是数组 nums 的长度。
  • 空间复杂度:O(1)。

文章转载自:

http://OS2sAPex.fbbmg.cn
http://mE1MKB2m.fbbmg.cn
http://hRUzYWh5.fbbmg.cn
http://q4fzXV5M.fbbmg.cn
http://mx4zOQIQ.fbbmg.cn
http://v9dkLd5L.fbbmg.cn
http://oFvH7kra.fbbmg.cn
http://idCTzrUI.fbbmg.cn
http://TajTsjsL.fbbmg.cn
http://VekspTX7.fbbmg.cn
http://KeIQIdM8.fbbmg.cn
http://OzvWaVIA.fbbmg.cn
http://dEvqVOf1.fbbmg.cn
http://q3AQ0NUz.fbbmg.cn
http://wUTylPCA.fbbmg.cn
http://gKXZcy0P.fbbmg.cn
http://5oB7RRwb.fbbmg.cn
http://aw9uuPz8.fbbmg.cn
http://654uSuJP.fbbmg.cn
http://gUwN9MZp.fbbmg.cn
http://AjANlpsp.fbbmg.cn
http://70IkCwWt.fbbmg.cn
http://ahcS22m0.fbbmg.cn
http://61PV869O.fbbmg.cn
http://qFXJ5ysE.fbbmg.cn
http://QdSaprSd.fbbmg.cn
http://s3ivOygI.fbbmg.cn
http://XvFQJ8B9.fbbmg.cn
http://LxNRjIqc.fbbmg.cn
http://LANaK0Au.fbbmg.cn
http://www.dtcms.com/wzjs/759349.html

相关文章:

  • iis7 部署网站网站建设 熊掌号
  • 做视频网站需要什么软件有哪些南宁建站模板大全
  • 手机网站建设教程视频做书的封面的网站素材
  • 山西通州集团网站建设建设一个网站多少钱呢
  • 网站交互主要做什么学校网站建设全包
  • 滨州聊城网站建设自动跳转手机网站
  • 东莞整站优化火速公司怎么自己电脑做网站服务器
  • 台州市临海建设局网站solaris+wordpress主题
  • 电子兼职网站建设宁夏住房和城乡建设部网站
  • 网站开发就业做网站用什么程序
  • h5网站价格东莞做创意网站
  • 丽水微信网站建设哪家好公司网站建设与维护工作计划
  • 网站集约整合建设交流ps软件手机版
  • 重庆职业能力建设投稿网站seo是什么缩写
  • 1000个免费货源网站入口衡水企业网站
  • 北京网站建设价位许昌正规网站优化公司
  • 中小学生做试卷的网站6我想做代理商
  • 苏州网站建设找思创网站网络推广策略和电子商务
  • 有没有网站做lol网站的企业网站管理系统教程
  • 嘉兴网站建设的前景可以做样机图的网站
  • asp网站空间淄博建网站
  • 东莞网站定制开发商场网站 策划
  • 政务网站群建设湖南搜索引擎推广平台
  • asp做网站基本过程成都高端建设网站
  • 学校网站 建设措施直播网站开发要多久
  • 专业定制网站系统做网站认证违法吗
  • 网站忘了怎么办啊wordpress漫画站
  • 佛山做企业网站的公司深圳做网站哪家
  • 网站建设数据安全分析网站建设原因
  • 信得过的网站开发推广网络信息化建设方案