zoukankan      html  css  js  c++  java
  • LeetCode 4sum

    链接:https://oj.leetcode.com/problems/4sum/


    一种方法是跟3sum一样,使用头尾指针交替移动,时间复杂度为O(n3),空间复杂度为O(1),注意去重

    class Solution
    {
    	public:
    		vector<vector<int> >fourSum(vector<int> &num,int target)
    		{
    			vector<vector<int> > ans;
    			sort(num.begin(),num.end());
    			int n=num.size();
    			for(unsigned int i=0;i<n;i++)
    			{
    			    if(i > 0 && num[i] == num[i-1])
                        continue;
    				for(unsigned int j=i+1;j<n;j++)
    				{
    				    if(j > i + 1 && num[j] == num[j-1])
                            continue;
    					int st=j+1,en=n-1;
    					while(st<en)
    					{
    					    if(st>j+1&&num[st]==num[st-1])
    					    {
    					        st++;
    					        continue;
    					    }
    					    if(en<n-1&&num[en]==num[en+1])
    					    {
    					        en--;
    					        continue;
    					    }
    						int sum=num[i]+num[j]+num[st]+num[en];
    						if(sum>target)
    							en--;
    						if(sum<target)
    							st++;
    						if(sum==target)
    						{
    							vector<int> tem;
    							tem.push_back(num[i]);
    							tem.push_back(num[j]);
    							tem.push_back(num[st]);
    							tem.push_back(num[en]);
    							ans.push_back(tem);
    							tem.clear();
    							st++;
    							en--;
    						}
    
    					}
    				}
    			}
    
    			return ans;
    		}
    };


    还有一种比较高效的方法是牺牲空间复杂度去换取时间复杂度:

    使用哈希表储存所有元素两两的和,然后在做一次2sum.

    而且,2sum是有线性算法的:把所有元素放如哈希表中,通过哈希表判断target-num是否存在,因为利用了哈希表,所以每次判断只需常数级的时间。

    去重的话,可以考虑set

  • 相关阅读:
    C# MVC解决跨站请求伪造(appscan)
    .net中关于Url传参问题
    二月项目完成小结
    sql 获取时间
    ajax提交form表单
    C# 视图遍历List数组
    C#遍历指定文件夹中的所有文件
    C#关于文件的操作
    .net 文件上传到服务器【转】
    Server.MapPath获取各级目录【转】
  • 原文地址:https://www.cnblogs.com/frankM/p/4399426.html
Copyright © 2011-2022 走看看