leetcode-18. 4Sum

2021-03-02 李安替
題目描述(中等難度)

給定一個包含 n 個整數的數組 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。

和3Sum類似,只不過是找四個數,使得和為 target,並且不能有重複的序列。如果之前沒有做過3Sum可以先看看,自己在上邊的基礎上加了一個循環而已。

暴力破解法

採用和3Sum解法一相同的暴力破解。

Python
class Solution(object):
    def fourSum(self, nums, target):
        list1=[]
        list2=[]

        for i in range(len(nums)-2):
            for j in range(i+1,len(nums)):
                for k in range(j+1,len(nums)):
                    for l in range(k+1,len(nums)):
                        if(nums[i]+nums[j]+nums[k]+nums[l]==target):
                            list1.append([nums[i],nums[j],nums[k],nums[l]])
        for i in list1:
            a=sorted(i)
            if a not in list2:
                list2.append(a)
        return list2

可以看出已經超出時間限制,由於有四層循環,一般超過三層循環,就會超出時間複雜度。

解法二Java
public class _4sum {
 public static List<List<Integer>> fourSum(int[] num, int target) {
  Arrays.sort(num);
  List<List<Integer>> res=new LinkedList<> ();
  for(int j=0;j<num.length-3;j++) {
   if(j==0 || num[j]!=num[j-1]) {
    for(int i=j+1;i<num.length-2;i++) {
     if(i==j+1 || num[i]!=num[i-1]) {
      int lo=i+1,hi=num.length-1,sum=target-num[j]-num[i];
      while(lo<hi) {
       if(num[lo]+num[hi]==sum) {
        res.add(Arrays.asList(num[j],num[i],num[lo],num[hi]));
        while(lo<hi && num[lo]==num[lo+1]) lo++;
        while(lo<hi && num[hi]==num[hi-1]) hi--;
        lo++;
        hi--;
       }else if(num[lo]+num[hi]<sum) {
        lo++;
       }else {
        hi--;
       }
      }
     }
    }
   }
  }
  return res;
 }
 public static void main(String args[]) {
  int[] num= {1,0,-1,0,-2,2};
  int target=0;
  List<List<Integer>> res=fourSum(num, target);
  System.out.println(res);
 }
}

時間複雜度:O(n³)。

空間複雜度:O(N),最壞情況,即 N 是指 n 個元素的排列組合個數,即

相關焦點

  • LeetCode-18.四數之和(4Sum)
    18.
  • 每天一道leetcode18-四數之和
    正當班主任要繼續發話,只聽到角落默默想起來一個聲音:」K2」前言 2018.11.20號打卡今天的題目leetcode61:https://leetcode-cn.com/problems/rotate-list/description/昨天的題解題目 每天一道leetcode18- 四數之和分類:雙指針
  • LeetCode-1.兩數之和(Two Sum)
    相信每個想刷leetcode的人,第一次打開網站,就從這道題開始的。一起起航吧,Great Voyage.
  • [LeetCode] 918. Maximum Sum Circular Subarray 環形子數組的最大和
    Given a circular array C of integers represented by A, find the maximum possible sum
  • 四數之和(18)-四數之和(454)-LeetCode
    18 四數之和給定一個包含 n 個整數的數組 nums 和一個目標值 target,判斷
  • [LeetCode] 1022. Sum of Root To Leaf Binary Numbers 從根到葉的二進位數之和
    Return the sum of these numbers. The answer is guaranteed to fit in a 32-bits integer.Example 1:Input: root = [1,0,1,0,1,0,1]Output: 22Explanation: (100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22Example 2:Input: root =
  • 一套代碼解決 Combination Sum 系列問題(LeetCode 39/40/216)
    動態規劃題目:LeetCode 377 - Combination Sum IV[4](Medium)變化之處:……我怎麼看已經變成另一道題了呢?這道題其實非常有迷惑性。我們重新讀一下題:給定一個由正整數組成且不存在重複數字的數組,找出和為給定目標正整數的組合的個數。
  • Go 實現 LeetCode 全集
    /problems/two-sum/[X] Best Time to Buy and Sell Stock - https://leetcode.com/problems/best-time-to-buy-and-sell-stock/[X] Contains Duplicate - https://leetcode.com/problems/contains-duplicate
  • LeetCode-53. Maximum Subarray | 最大子序和
    題目LeetCode[1]LeetCode-cn[2]Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum
  • ​LeetCode刷題實戰18: 四數之和
    今天和大家聊的問題叫做四數之和 ,我們先來看題面:https://leetcode-cn.com/problems/4sum/Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such
  • LeetCode-4-動態規劃
    示例:輸入: [10,9,2,5,3,7,101,18]輸出: 4 解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。說明:可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。你算法的時間複雜度應該為 O(n^2) 。進階: 你能將算法的時間複雜度降低到 O(n*logn) 嗎?
  • LeetCode刷題筆記 01 Two Sum
    恰好今天是周末,時間比較寬裕,我們來刷一道leetcode連結https://leetcode.com/problems/two-sum/題目給定一個整型數組和另外一個整數,在數組找出兩個整數,使得它們的和等於給定的整數。返回這兩個整數的下標。
  • leetcode刷題指南之PatchingArray
    掃描數組, 令sum表示當前我們能得到1 ~ sum的值。那麼接下來的數x如果小於等於sum+1, 那麼我們直接加進來更新sum的值(sum += x), 否則, 我們為了得到sum+1這個數, 我們必然要加入一個數。顯然加入sum+1這個數是最優決策。例子:以nums = [1,2,7], n = 14為例。
  • 兩數相加 | Leetcode題解
    示例:輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 0 -> 8原因:342 + 465 = 807難度:支持語言:JavaScript
  • LeetCode
    許久沒更新了,這回放上4道力扣的題吧1480. 一維數組的動態和連結:https://leetcode-cn.com/problems/running-sum-of-1d-array/給你一個數組 nums 。
  • 三數之和 | Leetcode題解
    示例:給定數組 nums = \[-1, 0, 1, 2, -1, -4\],滿足要求的三元組集合為:\[  \[-1, 0, 1\],  \[-1, -1, 2\]\]難度:支持語言15.3-sum在這裡之所以要排序解決是因為, 我們算法的瓶頸在這裡不在於排序,而在於 O(N^2),如果我們瓶頸是排序,就可以考慮別的方式了。
  • LeetCode Weekly Contest 224 題解
    Tuple with Same Product題目連結:https://leetcode.com/problems/tuple-with-same-product/題解連結:https://github.com/yular/CC--InterviewProblem/blob/master/LeetCode/leetcode_tuple-with-same-product.cpp
  • leetcode之字符串相加
    序本文主要記錄一下leetcode之字符串相加題目給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。
  • 初級樹狀數組 leetcode 練習題
    代碼:https://github.com/tiankonguse/leetcode-solutions/blob/master/problemset-new/003/00307-range-sum-query-mutable/range-sum-query-mutable.cc三、計算右側小於當前元素的個數題意:給一個數組,求每個位置右側比自己小的元素個數
  • 回溯法|一文解決四道 Leetcode「組合總和」題
    組合總和」 和 「leetcode-40.「leetcode-39.+candidates[j],temp_list+[candidates[j]])        backtrack(0,0,[])        return res「leetcode-40.