• 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

  • 相关阅读:
    websocket协议
    vue组件之间的传值
    vue中非父子组件的传值bus的使用
    $.proxy的使用
    弹性盒模型display:flex
    箭头函数与普通函数的区别
    粘贴到Excel的图片总是有些轻微变形
    centos rhel 中文输入法的安装
    vi ,默认为 .asm .inc 采用nasm的语法高亮
    how-to-convert-ppk-key-to-openssh-key-under-linux
  • 原文地址:https://www.cnblogs.com/frankM/p/4399426.html
Copyright © 2020-2023  润新知