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

做响应式网站设计师如何布局呢广州市口碑seo推广

做响应式网站设计师如何布局呢,广州市口碑seo推广,国内网站设计欣赏,做商城购物网站题目: 给你一个整数数组 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/wzjs/438793.html

相关文章:

  • 网页设计与网站建设入门到精通广东疫情最新情况
  • 网站建设税点网站seo优化皆宣徐州百都网络不错
  • 永久免费网站推荐google搜索免费入口
  • 建立学校网站网络推广要求
  • 国外做兼职的网站有哪些网站收录怎么弄
  • 常州网站制作公司排名指数函数图像
  • 服装网站怎么做的违禁网站用什么浏览器
  • 广州英文网站制作baiduseoguide
  • 州网站建设网络营销的营销理念
  • 购物网站论文优化seo是什么意思
  • 广州建设网站是什么样的搭建一个app平台要多少钱
  • 咸宁市住房和城乡建设委员会网站网络卖货平台有哪些
  • wp网站打开太慢怎么做优化电商网站设计模板
  • 重庆没建网站的企业最新的销售平台
  • 网站通栏代码知乎推广优化
  • 湖南微信网站公司重庆做seo外包的
  • 网站制作 天津新媒体运营是做什么
  • 做视频网站 带宽计算百度自媒体怎么注册
  • 怎样才能接外单 需做网站吗成都网站seo外包
  • wordpress网店适合企业seo网站推广
  • 分销网站建设方案自媒体平台注册入口
  • 网站关键词 公司网页设计与网站开发
  • html网站怎么做视频教程公司怎么做网络营销
  • 端州网站建设公司长沙做优化的公司
  • 建筑模板破碎机企业seo优化服务
  • 淘宝网站建设好评宁波seo托管公司
  • 新公司做网站怎么弄关键词免费
  • seo爱站网代运营电商公司
  • 中小企业erp系统哪个好电脑优化系统的软件哪个好
  • dw旅游网站模板seo的培训班