zoukankan      html  css  js  c++  java
  • LeetCode 18. 4Sum

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

    Note: The solution set must not contain duplicate quadruplets.

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

     

    Subscribe to see which companies asked this question

    #include "common.h"
    using namespace std;
    
    /*
    leetcode 18. 4Sum
    时间复杂度: N^3
    该题如果用暴力搜索,四重循环,时间复杂度是N^4,这样很可能
    会超时,所以考虑先排序所有的元素,然后对四个变量也按照一定
    的前后顺序排列,有方向的搜索解(四个元素的和比较target来确定
    搜索方向)
    这里要考虑去重,每一个循环里都要考虑
    */
    
    class Solution {
    public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
            vector<vector<int> > record;
    		record.clear();
    		if(nums.size()<4) return record;
    		vector<int> temp;
    		int a=0,b=0,c=0,d=0;
            sort(nums.begin(),nums.end());
    		for(a=0;a<nums.size()-3;a++)
    		{
    		    if(nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target) break;//剪枝操作
    			if(a!=0 && nums[a]==nums[a-1]) //去重操作
    					continue;
    			for(d=nums.size()-1;d>2;d--)
    			{
    			    if(nums[d]+nums[d-1]+nums[d-2]+nums[d-3]<target) break;//剪枝操作,效果很明显
    				if(d!=(nums.size()-1) && nums[d]==nums[d+1]) //去重操作
    					continue;
    				b=a+1;
    				c=d-1;
    				while(b<c)
    				{
    					//去重操作
    					if(nums[b]==nums[b-1] && (b-1)!=a)
    					{
    						b++;
    						continue;
    					}
    					if(nums[c]==nums[c+1] && (c+1)!=d)
    					{
    						c--;
    						continue;
    					}
    					if(target==(nums[a]+nums[b]+nums[c]+nums[d]))
    					{
    						temp.clear();
    						temp.push_back(nums[a]);
    						temp.push_back(nums[b]);
    						temp.push_back(nums[c]);
    						temp.push_back(nums[d]);
    						record.push_back(temp);
    						b++;
    					}
    					else if(target<(nums[a]+nums[b]+nums[c]+nums[d]))
    						c--;
    					else
    						b++;
    				}
    			}	
    		}
    		return record;
        }
    };
    
    
    int main() {
    	int a[]={5,5,3,5,1,-5,1,-2};
    	vector<int> nums(a,a+sizeof(a)/sizeof(int));
    	for(int i=0;i<nums.size();i++)
    		cout<<nums[i]<<" ";
    	cout<<endl;
    	int target=4;
    	Solution s;
    	vector<vector<int> > ve;
    	ve=s.fourSum(nums,target);
    	for(int i=0;i<ve.size();i++)
    	{
    		cout<<endl;
    		for(int j=0;j<ve[i].size();j++)
    			cout<<ve[i][j]<<" ";
    	}
    	getchar();
    	return 0;
    }
    



  • 相关阅读:
    净化心灵的诗歌--《当你老了》
    慎在信号的handler中嵌入复杂的逻辑
    windows远程ssh与scp操作linux
    Java Annotation(Java 注解)
    HTML5实现的类似百度文库,豆丁在线文档阅读
    FreeMarker VS Velocity(freemarker模板引擎和velocity模板引擎比较)
    J2EE牛人或者老的JAVA程序员进来帮忙指点一二,小弟很迷茫_Baidu知道
    模仿Hibernate的逆向工程_java版_源码下载
    Adobe Photoshop CS6_下载_补丁
    lucene in action_index and search
  • 原文地址:https://www.cnblogs.com/gremount/p/5768002.html
Copyright © 2011-2022 走看看