4Sum

来源:互联网 发布:java找不到或无法加载 编辑:程序博客网 时间:2024/06/09 22:29

4Sum

 Total Accepted: 45840 Total Submissions: 210663My Submissions

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:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
  • 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)
跟三个数求和一样,外面多加一层循环
class Solution {public:    vector<vector<int>> fourSum(vector<int>& nums, int target)  {int size = nums.size();vector<vector<int> > result;if( size < 4) return result;//排序int *number = new int[size];for( int i = 0; i < size; i++)number[i] = nums[i];    QuickSort(number, size);//求三角数for(int k = 0; k < size - 3; k++){if( k != 0 && number[k] == number[k-1])continue;for( int i = k + 1;i < size - 2; i++ ){if( number[i] == number[i-1] && i > k + 1 )continue;int sum = target - number[k]- number[i];int mid = i + 1;int right = size - 1;while(mid < right){if( number[mid] == number[mid -1] && mid > i+1){       mid ++;continue;}int tmp = number[mid] + number[right];if( tmp == sum ){vector<int> tri;tri.push_back( number[k]);tri.push_back( number[i]);tri.push_back( number[mid]);tri.push_back( number[right]);result.push_back(tri);mid ++; right --;}else if(tmp < sum) mid ++; else right --; }}}    delete []number;return result;    }//从小到大排序void QuickSort(int *num, int size){if( size <= 1) return;int mid = num[size - 1],tmp, i = 0,j = 0;for(; i < size - 1; i ++){if( num[i] < mid){tmp = num[i];num[i] = num[j];num[j] = tmp;j++;}}num[size - 1] = num[j];num[j] = mid;if(j > 1)QuickSort(num, j );if(j < size - 2)QuickSort(num + j + 1, size - j - 1); }};


0 0
原创粉丝点击