力扣hot100——15. 三数之和
题目链接: 15. 三数之和 - 力扣(LeetCode)
题目要求: 三元组元素索引不可重复,三元组元素不能完全相同。
思路: 首先对数组进行排序,for循环枚举第一个元素,双指针指向第二、三个元素。计算三者之和,如果和大于0,元素偏大,减小右指针;如果小于0,元素偏小,增大左指针。同时注意考虑去重操作。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > 0)
break;//剪枝,三元组中最小的元素大于0,相加一定大于0,不符合条件
if (i > 0 && nums[i] == nums[i - 1])
continue;//去重
int left = i + 1, right = nums.size() - 1;//初始化双指针
while (left < right) {
if (nums[i] + nums[left] + nums[right] < 0)//和偏小
left++;
else if (nums[i] + nums[left] + nums[right] > 0)//和偏大
right--;
else {//相等,符合条件
result.push_back({nums[i], nums[left], nums[right]});
//去重
while (left < right && nums[right] == nums[right - 1])
right--;
while (left < right && nums[left] == nums[left + 1])
left++;
//指向下一种可能情况
right--,left++;
}
}
}
return result;
}
};
- 时间复杂度:O(n2),循环O(n),双指针O(n)
- 空间复杂度:O(1)