力扣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)
posted @ 2025-04-16 17:01  林下清风~  阅读(34)  评论(0)    收藏  举报