zoukankan      html  css  js  c++  java
  • [array] leetCode-15. 3Sum-Medium

    leetCode-15. 3Sum-Medium

    descrition

    Given an array S of n integers, are there elements a, b, c 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]
    ]
    

    解析

    方法1

    3 重循环,时间复杂度-O(n^3),空间复杂度-O(1)

    for(int i=0; i<array.size(); i++){
    	for(int j=i+1; j<array.size(); j++){
    		for(int k=j+1; k<array.size(); k++){
    			// 检查是否合法
    		}
    	}
    }
    

    方法2

    思考方向:是否可以减少方法 1 中的循环查找次数??

    时间复杂度-O(n^2),空间复杂度-O(1)。

    对数组进行排序,需要时间 O(nlog(n))。使用两重循环,最外层循环 a=array[i],内层循环使用双向指针进行遍历,b 从左到右,c 从右到左,思想和 two sum 一样。(参看代码)

    code

    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <unordered_map>
    
    using namespace std;
    
    class Solution{
    public:
    	vector<vector<int> > threeSum(vector<int>& nums){
    		// The solution set must not contain duplicate triplets.
    		vector<vector<int> > ans;
    		sort(nums.begin(), nums.end()); // ascending
    		for(int i=0; i<nums.size(); i++){
    			int target = -nums[i];
    			int ileft = i+1;
    			int iright = nums.size()-1;
    			while(ileft < iright){
    				int sum = nums[ileft]+nums[iright];
    				if( sum == target){
    					// answer
    					vector<int> temp(3);
    					temp[0] = nums[i];
    					temp[1] = nums[ileft];
    					temp[2] = nums[iright];
    					ans.push_back(temp);
    					// skip duplicate
    					while(ileft<iright && nums[ileft] == temp[1])
    						ileft++;
    					while(ileft<iright && nums[iright] == temp[2])
    						iright--;
    				}else if (sum < target){
    					ileft++;
    				}else{
    					// sum > target
    					iright--;
    				}
    			}
    
    			// skip duplicate
    			while((i+1)<nums.size() && nums[i+1] == nums[i])
    				i++;
    			// i point to the same value, after the i++ in the for loop, i will point to next value
    		}
    
    		return ans;
    	}
    };
    
    int main()
    {
    	return 0;
    }
    
    
  • 相关阅读:
    A Bug's Life POJ 2492
    First Training
    洛谷----P1162 填涂颜色
    软考知识点梳理--软件测试
    软考知识点梳理--面向对象方法
    软考知识点梳理--国家信息化体系六要素
    软考知识点梳理--电子政务
    软考知识点梳理--激励理论
    软考知识点梳理--承建方项目论证
    软考知识点梳理--项目成本类型
  • 原文地址:https://www.cnblogs.com/fanling999/p/7828880.html
Copyright © 2011-2022 走看看