zoukankan      html  css  js  c++  java
  • leetcode: 4Sum

    http://oj.leetcode.com/problems/4sum/

    Given an array S of n integers, are there elements a, b, c, 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)
     

    思路

    3Sum的代码扩展一下搞定。

     1 class Solution {
     2 public:
     3     void threeSum(vector<int> &num, int start_index, int target, int v1, vector<vector<int> > &result) {
     4         int size = num.size();
     5         
     6         for (int i = start_index; i < size - 2; ) {
     7             int j = i + 1, k = size - 1, tmp;
     8             
     9             while (j < k) {
    10                 int sum = v1 + num[i] + num[j] + num[k];
    11                 
    12                 if (target == sum) {
    13                     vector<int> r;
    14                     
    15                     r.push_back(v1);
    16                     r.push_back(num[i]);
    17                     r.push_back(num[j]);
    18                     r.push_back(num[k]);
    19                     result.push_back(r);
    20                 }
    21                 
    22                 if (sum < target) {
    23                     tmp = j + 1;
    24                     
    25                     while ((tmp < k) && (num[j] == num[tmp])) {
    26                         ++tmp;
    27                     }
    28                     
    29                     j = tmp;
    30                 }
    31                 else {
    32                     tmp = k - 1;
    33                     
    34                     while ((tmp > j) && (num[tmp] == num[k])) {
    35                         --tmp;
    36                     }
    37                     
    38                     k = tmp;
    39                 }
    40             }
    41             
    42             tmp = i + 1;
    43             
    44             while ((tmp < (size - 2)) && (num[i] == num[tmp])) {
    45                 ++tmp;
    46             }
    47             
    48             i = tmp;
    49         }
    50     }
    51     
    52     vector<vector<int> > fourSum(vector<int> &num, int target) {
    53         vector<vector<int> > result;
    54         int size = num.size(), tmp;
    55         
    56         sort(num.begin(), num.end());
    57         
    58         for (int i = 0; i < (size - 3); ) {
    59             threeSum(num, i + 1, target, num[i], result);
    60             
    61             tmp = i + 1;
    62             
    63             while ((tmp < (size - 3)) && (num[i] == num[tmp])) {
    64                 ++tmp;
    65             }
    66             
    67             i = tmp;
    68         }
    69         
    70         return result;
    71     }
    72 };
  • 相关阅读:
    样式
    读取网页图片(包含代理)
    C# 替换“换行符”写法
    Iframe中弹出消息问题
    程序list
    C#对象序列化
    软件工程——个人总结
    软件工程——团队作业4
    软件工程———团队答辩
    软件工程--团队作业三
  • 原文地址:https://www.cnblogs.com/panda_lin/p/4sum.html
Copyright © 2011-2022 走看看