【LeetCode】leetcode sum問題まとめまとめ

6467 ワード

1. 2Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
2つの数を加算するので、hashテーブルで記録数aと数target-aが出現したか否かを記録すればよいが、下付きを記録するのでhashを用いる.
そして前から後まで遍歴し、答えは一つしかないので、一度遍歴すればいいです.
class Solution {
public:
    vector twoSum(vector& nums, int target) {
         vector rst;
         unordered_map hash;
         for(int i=0;i

2. 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
という問題の結果は重複している可能性があり、下付き文字の出力は要求されないので、まずソートしてから、最初の数を毎回固定し、後の2つの数にtwo pointerを使用することができます.front back
front+back+first>0の場合、back--は、逆にfront++である.重複を避けるために、重複の数をスキップします.
class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> rst;
        sort(nums.begin(),nums.end());
        for(int i=0;i0&&nums[i]==nums[i-1]) continue;   //   n1   
            int n1=nums[i];
            int front=i+1;
            int back=nums.size()-1;
            while(front0) back--;
                else{
                	vector tmp{n1,n2,n3};
                	rst.push_back(tmp);
                	while(front

3. 3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
    For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
この問題は問題に似ていますが、答えは一つしかありません.そして、最近の点かどうかを判断するたびに、何を求めているのかを判断します.
class Solution {
public:
    int fourSumCount(vector& A, vector& B, vector& C, vector& D) {
        int rst=0,len=A.size();
        unordered_map hasha,hashb,hashc,hashd;
        sort(A.begin(),A.end());
        sort(B.begin(),B.end());
        sort(C.begin(),C.end());
        sort(D.begin(),D.end());
        inithash(A,hasha);
        inithash(B,hashb);
        inithash(C,hashc);
        inithash(D,hashd);
        if(A[0]+B[0]+C[0]+D[0]>0) return 0;
        if(A[len-1]+B[len-1]+C[len-1]+D[len-1]<0) return 0;
        for(int i=0;i0&&A[i]==A[i-1]) continue;
            int sum3=0-A[i];
            for(int j=0;j0&&A[j]==A[j-1]) continue;
                if(B[j]+C[j]+D[j]>0) break;
                if(B[len-1]+B[len-1]+C[len-1]<0)
                
            }

        }
        
        
        
    }
    void inithash(vector&A, unordered_map &hash){
        for(int i=0;i

18. 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: 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]
]

3 sumに似ていますが、4つにアップグレードすると前の2つを固定でき、さらにループを加えて、O(n^3)の複雑さが増します.オオカミのコードを参考にして枝を切ることもできます
class Solution {
public:
    vector> fourSum(vector& nums, int target) {
        vector> total;
        int n = nums.size();
        if(n<4)  return total;
        sort(nums.begin(),nums.end());
        for(int i=0;i0&&nums[i]==nums[i-1]) continue;
            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
            if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]i+1&&nums[j]==nums[j-1]) continue;
                if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
                if(nums[i]+nums[j]+nums[n-2]+nums[n-1]target) right--;
                    else{
                        total.push_back(vector{nums[i],nums[j],nums[left],nums[right]});
                        do{left++;}while(nums[left]==nums[left-1]&&left

19. 4Sum II
Given four lists A, B, C, D of integer values, compute how many tuples  (i, j, k, l)  there are such that  A[i] + B[j] + C[k] + D[l]  is zero.
To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.
この問題は個数を要求するだけで、具体的な下付き値を必要としないので、2つの1組の和を求めて、各和の値に対してhash記録をして、1つのhashを遍歴して、別のhashの中でtargetの値と2つの値の個数の和が現れたかどうかを探します.
class Solution {
public:
    void fillMap(vector& A, vector& B, unordered_map &m)
    {
        int n = A.size();
        for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
          ++m[A[i] + B[j]];
          
    }
    int fourSumCount(vector& A, vector& B, vector& C, vector& D) {
        unordered_map m1, m2;
        fillMap(A, B, m1);
        fillMap(C, D, m2);
        int res = 0;
        for(auto it = m1.begin(); it != m1.end(); ++it)
        {
           auto it2 = m2.find(-it->first);
           if(it2 != m2.end())
             res += it->second*it2->second;
        }
        return res;
    }