当前位置: 首页> 汽车> 车展 > 广东东莞保安公司_广州监狱门户网站_百度的网站网址_外贸建站服务推广公司

广东东莞保安公司_广州监狱门户网站_百度的网站网址_外贸建站服务推广公司

时间:2025/7/11 7:53:22来源:https://blog.csdn.net/2402_86344613/article/details/145676403 浏览次数: 0次
广东东莞保安公司_广州监狱门户网站_百度的网站网址_外贸建站服务推广公司

题目

  1. 三数之和

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

来源:力扣热题100 15. 三数之和


思路(注意事项)


纯代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> v;sort (nums.begin(), nums.end());int n = nums.size();for (int i = 0; i < n; i ++){if (nums[i] > 0) break;if (i > 0 && nums[i] == nums[i - 1]) continue;int j = i + 1, k = n - 1;while (j < k){int sum = nums[i] + nums[j] + nums[k];if (sum == 0){v.push_back({nums[i], nums[j], nums[k]});do j ++; while (nums[j] == nums[j - 1] && j < k);do k --; while (nums[k] == nums[k + 1] && j < k);}else if (sum < 0) j ++;else k --;}}return v;}
};

题解(加注释)

#include <vector>
#include <algorithm>class Solution {
public:// 该函数用于找出数组中所有和为 0 的不重复三元组std::vector<std::vector<int>> threeSum(std::vector<int>& nums) {// 用于存储最终结果的二维向量,每个元素是一个包含三个整数的向量,表示一个和为 0 的三元组std::vector<std::vector<int>> v;// 对输入数组进行排序,方便后续使用双指针法和去重操作std::sort(nums.begin(), nums.end());// 获取数组的长度int n = nums.size();// 遍历数组,固定第一个元素for (int i = 0; i < n; i++) {// 如果当前元素大于 0,由于数组已经排序,后面的元素也都大于 0,不可能找到三个数的和为 0,直接跳出循环if (nums[i] > 0) break;// 如果当前元素和前一个元素相同,为了避免结果中出现重复的三元组,跳过当前元素if (i > 0 && nums[i] == nums[i - 1]) continue;// 初始化双指针,j 指向 i 的下一个元素,k 指向数组的最后一个元素int j = i + 1, k = n - 1;// 双指针法,只要 j 小于 k 就继续循环while (j < k) {// 计算当前三个元素的和int sum = nums[i] + nums[j] + nums[k];// 如果和为 0,说明找到了一个满足条件的三元组if (sum == 0) {// 将该三元组添加到结果向量中v.push_back({nums[i], nums[j], nums[k]});// 跳过重复的元素,避免结果中出现重复的三元组// j 指针右移,直到遇到不同的元素do j++; while (nums[j] == nums[j - 1] && j < k);// k 指针左移,直到遇到不同的元素do k--; while (nums[k] == nums[k + 1] && j < k);} // 如果和小于 0,说明需要增大和,将 j 指针右移else if (sum < 0) j++;// 如果和大于 0,说明需要减小和,将 k 指针左移else k--;}}// 返回存储所有满足条件三元组的二维向量return v;}
};
关键字:广东东莞保安公司_广州监狱门户网站_百度的网站网址_外贸建站服务推广公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: