菜鳥刷leetcode 18.4Sum

是3Sum算法的繼承,只是多了一個循環。3Sum算法要多練習。

代碼:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
		if(nums.size()<4) return result;
		sort(nums.begin(),nums.end());
		int i=0,j=0,k=0,l=0,aim=0,sum=0,len=nums.size();
		for(i=0;i<len-3;i++)
		{
			for(j=i+1;j<len-2;j++)
			{
				k=j+1;
				l=len-1;
				aim=target-nums[i]-nums[j];
				
				while(k<l)
				{
					sum=nums[k]+nums[l];
					if(sum<aim) k++;
					else if(sum>aim) l--;
					else
					{
						vector<int> temp;
						temp.push_back(nums[i]);
						temp.push_back(nums[j]);
						temp.push_back(nums[k]);
						temp.push_back(nums[l]);
						result.push_back(temp);
						while(k<l&&nums[k]==temp[2]) k++;
						while(k<l&&nums[l]==temp[3]) l--;
					}
				}
				while(nums[j+1]==nums[j]) j++;
			}
			while(nums[i+1]==nums[i]) i++;
		}
		
		return result;
    }
};

看到一個比較優質的算法,即在i,j循環開始的時候,先判斷i和j是否合適,然後再進行接下來的循環。多加幾個判斷條件,速度提升很多:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
		if(nums.size()<4) return result;
		sort(nums.begin(),nums.end());
		int i=0,j=0,k=0,l=0,aim=0,sum=0,len=nums.size();
		for(i=0;i<len-3;i++)
		{
            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
            if(nums[i]+nums[len-3]+nums[len-2]+nums[len-1]<target) continue;
			for(j=i+1;j<len-2;j++)
			{
                if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
                if(nums[i]+nums[j]+nums[len-2]+nums[len-1]<target) continue;
				k=j+1;
				l=len-1;
				aim=target-nums[i]-nums[j];
				
				while(k<l)
				{
					sum=nums[k]+nums[l];
					if(sum<aim) k++;
					else if(sum>aim) l--;
					else
					{
						vector<int> temp;
						temp.push_back(nums[i]);
						temp.push_back(nums[j]);
						temp.push_back(nums[k]);
						temp.push_back(nums[l]);
						result.push_back(temp);
						while(k<l&&nums[k]==temp[2]) k++;
						while(k<l&&nums[l]==temp[3]) l--;
					}
				}
				while(nums[j+1]==nums[j]) j++;
			}
			while(nums[i+1]==nums[i]) i++;
		}
		
		return result;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章