leetcode-半ば配列-31 3回の合計

私のコード:時間限定

1  DEF threeSum(NUMS):
 2          "" " 
3          :タイプNUMS:リスト[INT]
 4          :RTYPE:リスト[リスト[INT]
 5          """      
6          DEF twoSum(A、B、C):
 7              もし + B + C == 0:
 8                  リターン9              10                  リターン11の             
12の          RES = []
 13          のための I における範囲(LEN(NUMS)-2 ):
 14              =のNUMS [I]
 15              のための J 範囲(I + 1、lenの(NUMS)-1 ):
 16                  B = NUMS [J]
 17                  K = J +1
 18                  プリント(I、J、K、A、B、NUMS [K])
19                  一方、 K < LEN(NUMS):
 20                      プリント(A、B、NUMS [K])
 21                      ならtwoSum(A、B、NUMS [K]):
 22                          プリント' ... ' 、A、B、NUMS [K])
 23                          TEMP = [A、B、NUMS [K]
 24                          temp.sort()
 25                          プリント' ... TEMP ' 、TEMP)
 26                          もしTEMP ない RES:
 27                              res.append(TEMP)
 28                          プリント' ... RES ' 、RES)
 29                      K + = 1つの   
 30          戻り RES

 

アイデア:

1、n個の* nの時間複雑

ソート(WT1:なぜソート?) - 「辞書レコードの値の構築:数 - 」第三の数を判断しないで続けて2サイクルは、また、2サイクル(DICに使用されるレコード数)の値と等しくありません

1  クラス溶液(オブジェクト):
 2      
3      '' ' 
4      はO(n ^ 2)时间复杂度
 5      
6      ''' 
7      DEF threeSum(自己、NUMS):
 8          ""」
9          :タイプNUMS:リスト[INT]
 10          :RTYPE:リスト[リスト[INT]
 11          ""」
12          結果= []
 13          num_cnt_dict = {}
 14          
15          のために NUM NUMS:
 16              num_cnt_dict [NUM] = num_cnt_dict.get(NUM、0)+ 1
 17              
18          もし 0 num_cnt_dict  num_cnt_dict [0]> = 3 19              result.append([0、0、0])
 20          
21          NUMS = ソート(リスト(num_cnt_dict.keys()))
 22          
23          のために I、NUM 列挙(NUMS):
 24              のための J  NUMS [I + 1 :]:
 25                  であれば NUM * 2 + J == 0  num_cnt_dict [NUM]> = 2 26                      result.append([NUM、NUM、J])
 27                  なら j個* 2 + NUM == 0  num_cnt_dict [J]> = 2 28                     result.append([J、J、NUM])
 29                  
30                  = 0のdiff - NUM - J
 31                  であれば差分> J の差分num_cnt_dict:
 32                      result.append([NUM、J、差分])
 33          リターン結果

道のうち、次の回は、おそらくことに注意してください別のリストとdict.keys()を取得する方法を見つけます

                NUMSにおける差分> Bと差分場合 :#があれば前に重ならないようにするために、A> Bを留意すべきである
                    res.append([A、B、差分])は
        RESを返します

 

2、N * Mただし、n + mはLEN(NUMS)

建設辞書 - 「正と負に、DICのキーをソートしない - 」2つのサイクルのために

次の行を注意:フィルタは、列の増分数を取得するためにあるのでdiffがより小さいとき、I = diffがあるため、この状態で、説明するときは、最終的な結果に【、B、差分]にまだ満たされていません

もし差分<a又はdiff> B:
  res.append([A、B、差分])
1  クラス溶液(オブジェクト):
 2      
3      '' ' 
4      はO(n ^ 2)时间复杂度
 5      
6      ''' 
7      DEF threeSum(自己、NUMS):
 8          ""」
9          :タイプNUMS:リスト[INT]
 10          :RTYPE:リスト[リスト[INT]
 11          ""」
12の          RES = []
 13          DIC = {}
 14          のための項目NUMS:
 15              DIC [商品] = dic.get(項目、0)+ 1   
 16          であれば 0  DIC および DIC [0]> = 317              res.append([0,0,0]) -なぜなら、この場合に加えて、3人のループ数は、」0に等しく、もはや現れる理由は、別々にリストされるべきではない
18は         = NUMSソート(リスト(dic.keys()))
19。          NEG =リスト(フィルタ(ラムダ X:X < 0、dic.keys()))
 20が          POS =リスト(フィルタ(ラムダ X:X> = 0、dic.keys ()))
 21がある         ためNEG:
 22である             ため B における POS: -1 jはLEN(NUMS有界されていない理由) -偶然の第3の数とNUMS [j]をがあるかもしれないので、」に等しい
23が                  差分= 0 - A - B
 24                  IF差分DIC:
25                      もし差分における(B)及び DIC [差分]> = 2 26                          res.append([A、B、差分])
 27                      であれば差分<a 又は diff> B:
 28                          res.append([B 、差分])
 29の         リターン RES

 

おすすめ

転載: www.cnblogs.com/rosyYY/p/10963478.html