麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

[Leetcode] 15. 3Sum

2019-11-14 10:31:44
字體:
供稿:網(wǎng)友

PRoblem:

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] ]

思路 1. 暴力枚舉法+分類討論法。這種題直接暴力枚舉的話,時(shí)間復(fù)雜度高達(dá)O(n^3),所以我一開始對(duì)暴力枚舉加上了分類討論。三個(gè)數(shù)之和為0有以下幾種情況:

情況 負(fù)數(shù)個(gè)數(shù) 零個(gè)數(shù) 正數(shù)個(gè)數(shù)
1 2個(gè) 0個(gè) 1個(gè)
2 1個(gè) 0個(gè) 2個(gè)
3 1個(gè) 1個(gè) 1個(gè)
4 0個(gè) 3個(gè) 0個(gè)

因此,首先對(duì)輸入的數(shù)組進(jìn)行“正數(shù),零,負(fù)數(shù)”分類,然后再窮舉這四種情況的所有組合。最后發(fā)現(xiàn),時(shí)間復(fù)雜度仍然接近O(n^3),這優(yōu)化意義不大。

#Note: 以下兩種方法是題目“2sum”的延伸。“2sum”求的是:對(duì)于輸入的數(shù)組,求出兩數(shù)之和等于某特定值的所有組合。在這題目“3sum”中,因?yàn)轭}目是求a,b,c使得a+b+c=0,所以我們可以看作是求a,b使得a+b=-c。這樣其實(shí)就是窮舉版的“2sum”問題。 2. 借助hash表。對(duì)輸入的數(shù)組放入一個(gè)哈希表中,然后遍歷哈希表的每一個(gè)數(shù)a,然后調(diào)用2sum函數(shù):新建一個(gè)用于標(biāo)記的集合set,遍歷輸入數(shù)組的每一個(gè)值b(此時(shí)要去掉一個(gè)數(shù)a,因?yàn)閿?shù)具有不可復(fù)用性),判斷集合set中是否存在一個(gè)數(shù)c,使得c = -a-b。如果有,則為目標(biāo)答案,加到result list中;如果沒有,則把b數(shù)加入到集合set中。 這樣做的好處在于減少了一層循環(huán),使得時(shí)間復(fù)雜度降為O(n^2),但同時(shí)空間復(fù)雜度是O(n)。另外,調(diào)用2sum函數(shù)時(shí),也可以遍歷已建立好的hash表,可以更節(jié)省時(shí)間。不過需要注意的是要考慮[0,0,0]這種情況。 3. 雙向游標(biāo)法。首先將輸入數(shù)組nums排序,然后遍歷輸入數(shù)組的每個(gè)數(shù)a作為target值,然后調(diào)用2sum函數(shù):對(duì)于有序數(shù)組(除去數(shù)a),定義兩個(gè)指針指向首尾兩端,即,一個(gè)指向nums[0],一個(gè)指向num[len(nums)]。然后有如下三種情況: (1) 若當(dāng)前和小于-a,則左指針右移; (2) 若當(dāng)前和大于-a,則右指針左移; (3) 若當(dāng)前和等于-a,則為目標(biāo)答案。 這里排序的時(shí)間復(fù)雜度為O(nlogn),遍歷的時(shí)間復(fù)雜度為O(n^2),所以總的時(shí)間復(fù)雜度近似于O(n^2).

Solution :

方法2

# -*- coding: utf-8 -*-"""Created on Sat Feb 04 22:30:34 2017@author: liangsht"""def find2Sum(self,target,newdict): hashset = set() for item in newdict.keys(): remain = target - item if remain in hashset: if remain != item: self.myappend([-target,item,remain]) elif newdict[item] >= 2: self.myappend([-target,item,remain]) else: hashset.add(item)class Solution(object): res = [] def myappend(self,occupylist): occupylist.sort() if occupylist not in self.lll: self.res.append(occupylist) def threeSum(self, nums): self.res = [] numslen = len(nums) if numslen <= 2: return [] hashdict = dict() hashdict[int(nums[0])] = 1 for i in xrange(1, numslen): #construct a hash map for list nums if nums[i] in hashdict.keys(): hashdict[nums[i]] += 1 else: hashdict[nums[i]] = 1 for item in hashdict.keys(): if item == 0 and hashdict[item] >=3: self.myappend([0,0,0]) continue target = 0-item newdict = hashdict.copy() hashdict[item] -= 1 if hashdict[item] == 0: newdict.pop(item) find2Sum(self,target,newdict) return self.res

方法3

def threeSum(self, nums): res = [] nums.sort() for i in xrange(len(nums)-2): if i > 0 and nums[i] == nums[i-1]: continue l, r = i+1, len(nums)-1 while l < r: s = nums[i] + nums[l] + nums[r] if s < 0: l +=1 elif s > 0: r -= 1 else: res.append((nums[i], nums[l], nums[r])) while l < r and nums[l] == nums[l+1]: l += 1 while l < r and nums[r] == nums[r-1]: r -= 1 l += 1; r -= 1 return res

ref: 1. CSDN bolg 2. leetcode discussion


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 一级毛片在线免费观看视频 | 欧美18一19sex性护士农村 | 国产91精品久久久久久久 | 国产精品久久久久久久久久 | 毛片视频大全 | 欧美日韩亚州综合 | 一区二区三级视频 | 在线天堂资源 | 欧美成人午夜 | 久久噜噜噜精品国产亚洲综合 | 日韩黄在线观看 | 亚洲一区二区三区在线免费观看 | 日韩精品羞羞答答 | 欧美日韩国产一区二区三区在线观看 | 免费国产一级淫片 | 91精品国产综合久久久欧美 | 精品久久久久久久久久久αⅴ | 久久精品性视频 | 最新亚洲国产 | 禁漫天堂久久久久久久久久 | 中国大陆一级毛片 | 精品一区二区电影 | chinesexxxx刘婷hd 国产资源视频在线观看 | 99影视在线视频免费观看 | 欧美 日韩 国产 成人 | 一本色道久久综合狠狠躁篇适合什么人看 | 免费观看高清视频网站 | av在线官网 | 欧美成人一区二区视频 | 国产精品视频导航 | 在线中文字幕网站 | 久久精品无码一区二区三区 | 国产一区二区午夜 | 国产精品视频在 | 欧美一级黄色网 | 91一级毛片 | 黄色大片免费看 | 久久久久亚洲视频 | 国产资源在线看 | 五月天堂av91久久久 | 麻豆视频在线播放 |