zoukankan      html  css  js  c++  java
  • 15. 3Sum

    Problem statement:

    Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    Note: The solution set must not contain duplicate triplets.

    For example, given array S = [-1, 0, 1, 2, -1, -4],
    
    A solution set is:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]

    Solution:

    Which is different with 1. Two Sum, this question just need all three numbers whose sum is 0.

    The basic idea:

    • Sort this array by ascending order.
    • Loop from the first element in array. it becomes a two sum problem. For i element, we should find two elements from rest of the array whose sum is -nums[i].

    NOTE: In order to remove the duplicate element, we do duplication check when update the new value for the index, left and right pointers.

    Time complexity O(n * n). Space complexity is O(1).

    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            vector<vector<int>> triplet;
            // get the size of the array and convert it to integer type
            int size = nums.size();
            for(int i = 0; i < size - 1; i++){
                int left = i + 1;
                int right = size - 1;
                while(left < right){
                    // no need do duplicate check
                    // For the same number, it will do same operation until it changes
                    if(nums[left] + nums[right] == -nums[i]){
                        triplet.push_back({nums[i], nums[left], nums[right]});
                        // check for duplicated
                        while(left < right && left + 1 < size && nums[left] == nums[left + 1]){
                            left++;
                        }
                        // check for duplicated
                        while(left < right && right - 1 >= 0 && nums[right - 1] == nums[right]){
                            right--;
                        }
                        // normal pointers move
                        left++;
                        right--;
                    } else if (nums[left] + nums[right] > -nums[i]) {
                        right--;
                    } else {
                        left++;
                    }
                }
                // remove duplicate candidates
                while(i + 1 < size && nums[i] == nums[i + 1]){
                    i++;
                }
            }
            return triplet;
        }
    };
  • 相关阅读:
    Docker端口映射实现
    Docker容器访问控制
    Docker配置 DNS
    Docker快速配置指南
    Docker外部访问容器
    Docker容器如何互联
    Docker 备份、恢复、迁移数据卷
    19.30内置登录处理
    18.29SSM基础整合开发
    19.30内置登录处理
  • 原文地址:https://www.cnblogs.com/wdw828/p/6881525.html
Copyright © 2011-2022 走看看