做酒的网站有哪些,织梦dedecms5.6 网站搬家详细教程,百度搜索数据,一个万能的营销方案详细思路
排序数组#xff1a;首先对数组 nums 进行排序#xff0c;目的是为了方便后续使用双指针查找和避免重复结果。遍历数组#xff1a;使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素#xff1a;如果当前元素 nums[i] 与前一个元素… 详细思路
排序数组首先对数组 nums 进行排序目的是为了方便后续使用双指针查找和避免重复结果。遍历数组使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素如果当前元素 nums[i] 与前一个元素相同则跳过避免重复结果。提前结束循环如果当前元素 nums[i] 大于0因为数组已经排序后面的元素也都大于0不可能存在满足条件的三元组直接结束循环。双指针查找对于每个固定的元素 nums[i]使用双指针在其后的子数组中查找两个数 nums[j] 和 nums[k]使得它们的和为 -nums[i]。 调整指针根据当前三数之和调整双指针的位置 如果和大于0说明右边的数太大右指针 k 左移。如果和小于0说明左边的数太小左指针 j 右移。如果和等于0则找到一个满足条件的三元组将其加入结果并跳过重复的元素。返回结果所有符合条件的三元组都存储在 result 中最终返回该结果。
通过这种方法可以在时间复杂度为 O(n^2) 的情况下找到所有不重复的满足条件的三元组。 class Solution {
public:vectorvectorint threeSum(vectorint nums) {vectorvectorint result; // 用于存储结果三元组int n nums.size();if (n 2)return result; // 如果数组长度小于等于2不可能有满足条件的三元组直接返回空结果sort(nums.begin(), nums.end()); // 将数组排序// 遍历数组每次固定一个元素for (int i 0; i n - 3; i) {if (i 0 nums[i] nums[i - 1]) {continue; // 跳过重复的元素以避免结果中有重复的三元组}if (nums[i] 0)break; // 如果当前固定的数大于0由于数组已经排序后面的数也大于0不可能找到满足条件的三元组int j i 1, k n - 1; // 初始化双指针一个从左边开始一个从右边开始while (j k) {int sum nums[i] nums[j] nums[k];if (sum 0) {k--; // 如果三数之和大于0移动右指针向左} else if (sum 0) {j; // 如果三数之和小于0移动左指针向右} else {// 找到一个满足条件的三元组result.push_back({nums[i], nums[j], nums[k]});// 跳过重复的元素while (j k nums[j] nums[j 1]) j;while (j k nums[k] nums[k - 1]) k--;j;k--;}}}return result; // 返回结果}
};