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;
    }
    



  • 相关阅读:
    微信小程序实现运动步数排行(可删除)
    微信小程序实现运动步数排行(可删除)
    一个文艺的在线生成漂亮的二维码工具网站
    微信小程序常见的UI框架/组件库总结
    天天快车是款精细的游戏
    MHA的几种死法-叶良辰
    编译maxscale
    mydbtest文档
    高山仰止
    docker居然需要3.10以上的内核
  • 原文地址:https://www.cnblogs.com/gremount/p/5768002.html
Copyright © 2011-2022 走看看