石家庄有哪些做网站的公司,手机网络营销方案,网站开发与设计总结,wordpress调用第一张图片不显示LeetCode-15 三数之和
给你一个整数数组 nums #xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k #xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请
你返回所有和为 0 且不重复的三元组。
**注意#xff1a;**答案中不可以…LeetCode-15 三数之和
给你一个整数数组 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 。提示
3 nums.length 3000-105 nums[i] 105
solution
采用双指针的思想
排序并初始化向量res设当前指向为i其中j指向i的右边k指向vector的最后一个位置此时可以保证 nums[i] nums[j] nums[k]当jk时进入循环当 nums[i]大于0时nums[i] nums[j] nums[k]0必然存在退出循环若出现nums[i]nums[i - 1]则可能导致res有重复元素则执行continue操作使同一个数字只计算一次令 sum nums[i] nums[j] nums[k]若sum0则将j向右移动若sum0则将k向左移动若sum0则放入向量res中并去除j右侧的重复元素和k左侧的重复元素重复3-6步直到jk时退出循环
#include vectorusing namespace std;//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:vectorvectorint threeSum(vectorint nums) {int l nums.size();vectorvectorint res;sort(nums.begin(), nums.end());for (int i 0; i l - 2; i) {if (nums[i] 0) {break;}if (i - 1 0 nums[i] nums[i - 1]) {continue;}int j i 1, k l - 1;while (j k) {int sum nums[i] nums[j] nums[k];if (sum 0) {while (j k nums[j] nums[j]) {//j;}} else if (sum 0) {while (j k nums[k] nums[--k]) {//k--;}} else {res.push_back({nums[i], nums[j], nums[k]});while (j k nums[j] nums[j]) {//j;}while (j k nums[k] nums[--k]) {//k--;}}}}return res;}
};
//leetcode submit region end(Prohibit modification and deletion)int main() {Solution solution;vectorint vec {-1, 0, 1, 2, -1, -4};solution.threeSum(vec);
}