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

网站建设模板制作是什么意思优化手机软件

网站建设模板制作是什么意思,优化手机软件,thinkphp 网站根目录地址,电子商务网站建设收获题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…

题目:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != 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 。

思路:

拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。

依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。

接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。

如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。

时间复杂度:O(n^2)。

代码:

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;}
};

过程:

示例输入:nums = [-1,0,1,2,-1,-4]

排序后的数组为:[-4, -1, -1, 0, 1, 2]

详细执行过程如下:

  1. i=0(nums[i]=-4)

    • left=1,right=5

    • 计算和:-4 + (-1) + 2 = -3 < 0 → left++

    • left=2,和:-4 + (-1) + 2 = -3 < 0 → left++

    • ... 直到 left >= right,未找到解。

  2. i=1(nums[i]=-1)

    • 非重复元素,left=2,right=5

    • 和:-1 + (-1) + 2 = 0 → 记录 [-1,-1,2]

      • 跳过右侧重复(无),right=4,left=3

    • 新和:-1 + 0 + 1 = 0 → 记录 [-1,0,1]

      • 跳过重复后,循环结束。

  3. i=2(nums[i]=-1)

    • 与前一个元素重复,跳过。

  4. i=3(nums[i]=0)

    • 后续元素均正数,无解。

最终输出:[[-1,-1,2], [-1,0,1]]

部分代码分析:

 `if (i > 0 && nums[i] == nums[i-1])` 是去重核心逻辑**,目的是跳过重复的「第一个数」,确保不会生成重复的三元组。

📌 代码逻辑解析
1. 数组先排序:排序后为 `[-4, -1, -1, 0, 1, 2]`。
2. 固定第一个数:遍历每个元素 `nums[i]` 作为三元组的第一个数。
3. 双指针找后两个数:用 `left` 和 `right` 在 `i` 右侧的区间内搜索和为 `nums[i]` 的两个数。

但关键问题是:如果 `nums[i]` 重复出现,会导致重复的三元组。例如:
 当 `i=1` 时,`nums[i] = -1`,会找到三元组 `[-1,-1,2]` 和 `[-1,0,1]`。
-当 `i=2` 时,`nums[i] = -1`(与前一个数相同),此时若不跳过,会再次生成相同的三元组。

🌰 以你的示例逐步分析
1. 当 `i=1`(`nums[i]=-1`)
检查条件 `i > 0 && nums[i] == nums[i-1]`:
`i=1 > 0` 且 `nums[1] = -1 == nums[0] = -4`? → **不成立**,继续执行。
- 双指针找到两个解:`[-1,-1,2]` 和 `[-1,0,1]`。

2. 当 `i=2`(`nums[i]=-1`)
检查条件 `i > 0 && nums[i] == nums[i-1]`:
`i=2 > 0` 且 `nums[2] = -1 == nums[1] = -1` → 成立,跳过本次循环。


为什么跳过? 
   因为此时固定的是第二个 `-1`,而第一个 `-1`(即 `i=1`)已经处理过所有可能的三元组。如果继续处理,会重复生成以 `-1` 开头的相同三元组。

❓ 为什么要加 `i > 0`?
当 `i=0` 时,`nums[i-1]` 会越界,所以必须限定 `i > 0`。
只有从第二个元素开始(`i≥1`),才有必要检查是否与前一个元素重复。

 🚫 如果不加这个条件会怎样?


假设去掉 `i > 0`,则当 `i=0` 时,`nums[i]` 会与 `nums[i-1]`(即 `nums[-1]`,非法访问)比较,导致未定义行为。

✅ 总结条件的作用
跳过重复的「第一个数」:确保每个不同的值只作为第一个数处理一次。
依赖数组已排序:只有排序后,重复元素才会相邻,才能通过 `nums[i] == nums[i-1]` 判断重复。

 🌟 完整去重逻辑
1. 第一个数的去重:通过 `if (i>0 && nums[i]==nums[i-1])` 跳过。
2. 第二个数的去重:在找到解后,`while (left < right && nums[left] == nums[left+1]) left++`。
3. 第三个数的去重:在找到解后,`while (left < right && nums[right] == nums[right-1]) right--`。

这三步共同确保三元组在三个维度上不重复。

http://www.dtcms.com/a/501159.html

相关文章:

  • 1 企业网站的一般内容是什么Html手机浏览网站变形
  • 电商网站前台模块装潢设计软件
  • 在线做ppt的网站国内美食网站欣赏
  • 广东民航机场建设有限公司网站欧米茄官方
  • 版式设计模板网站中国机械加工网app
  • 《Foundation 滑块:界面设计的艺术与科学》
  • C++ 多态核心知识点笔记(整理与补充)
  • php网站模板源码东莞免费网站建设网络营销
  • 正规的推文平台优化措施最新回应
  • 个人全屏网站模板互联网平台是什么意思
  • 住房和城建设网站首页建设银行 商户网站打不开
  • php怎么做网站给企业做网站的好处
  • 网站策划建设方法网站备案代码生成
  • 网站制作合同范本如何用jsp做简单的网站
  • 怎么做网站推销产品济南网站建设哪家强
  • 摄影网站的设计与实现开题报告wordpress 静态化 cos
  • 网站300m空间国外的电商平台
  • 佛山个人制作网站公司新开发网站
  • 网页浏览器tv版廊坊seo按天计费
  • ZUC流密码加密解密工具
  • 在 Microsoft Azure 中托管 3CX PBX
  • 传感器检测技术
  • 网站的行为怎么做白鹭引擎做h5网站
  • 购物网站建站系统物联网开发软件有哪些
  • 传感器概述
  • html5网站动效怎么做电脑技术学习网站
  • 三只松鼠商务网站建设目的个人服务器网站备案
  • 电影网站加盟可以做么网页小游戏点击即玩
  • 为什么要做响应式网站重庆seo教程博客
  • 上海网站设计服务商做淘宝一样的网站有哪些