zoukankan      html  css  js  c++  java
  • 【LeetCode】16. 4Sum

    题目: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.

    给定一个数组,找出所有4个数的组合使得它们的和为target

    思路:和3Sum,Two Sum都是类似的。主要是两个点:

    1. 对数组排序,然后双指针分别从头尾遍历

    2. 注意去重的问题

     1 class Solution {
     2 public:
     3     vector<vector<int>> fourSum(vector<int>& nums, int target) {
     4         int nsize = nums.size();
     5         sort(nums.begin(), nums.end());
     6         vector<vector<int>> result;
     7         for(int i = 0; i < nsize; i++){
     8             if(i != 0 && nums[i] == nums[i - 1])
     9                 continue;
    10             for(int j = i + 1; j < nsize; j++){
    11                 if(j != i + 1 && nums[j] == nums[j - 1])
    12                     continue;
    13                 int p = j + 1, q = nsize - 1;
    14                 while(p < q){
    15                     int sum = nums[i] + nums[j] + nums[p] + nums[q];
    16                     if(sum < target){
    17                         ++p;
    18                         continue;
    19                     }
    20                     if(sum > target){
    21                         --q;
    22                         continue;
    23                     }
    24                    
    25                         vector<int> tmp;
    26                         tmp.push_back(nums[i]);
    27                         tmp.push_back(nums[j]);
    28                         tmp.push_back(nums[p]);
    29                         tmp.push_back(nums[q]);
    30                         result.push_back(tmp);
    31                         
    32                         while(++p < q && nums[p] == nums[p - 1]);
    33                         while(p < --q && nums[q] == nums[q + 1]);
    34                 }
    35             }
    36         }
    37         return result;
    38     }
    39 };
  • 相关阅读:
    C语言指针和数组
    C语言malloc、calloc函数
    33、二叉树的后序遍历序列
    进程、线程、协程
    8、字符串转整数
    51、数组中的逆序对
    49、丑数
    19、正则表达式匹配
    32、从上到下打印二叉树
    leetcode5:最长回文子串
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/5330983.html
Copyright © 2011-2022 走看看