摘要:求出滿足這樣要求的路徑的數(shù)目,并返回。第二道題給定一個數(shù),將其拆分為個平方數(shù)的和,求最小的。這道題不能用貪心算法求解。當(dāng)時,如果用貪心算法,結(jié)果就是,返回。假設(shè)給出的數(shù)字為。第三輪減,得到,將放入隊(duì)列中。
第一道題:
給定一棵二叉樹,在二叉樹的所有路徑中找到路徑上結(jié)點(diǎn)之和為題目給定值的子路徑。路徑不一定以根節(jié)點(diǎn)為開頭,也不一定以葉節(jié)點(diǎn)為結(jié)尾。并且根據(jù)分析路徑之間應(yīng)該可以重疊。求出滿足這樣要求的路徑的數(shù)目,并返回。
10 / 5 -3 / 3 2 11 / 3 -2 1 當(dāng)給出以上的二叉樹,并以8為路徑節(jié)點(diǎn)和時,5->3,5->2->1,-3->11三條路徑滿足條件返回三。
對于根節(jié)點(diǎn)來講,滿足條件的路徑,包括以根節(jié)點(diǎn)為起點(diǎn)的路徑,以及不以根節(jié)點(diǎn)為起點(diǎn)的路徑。
我們先定義一個函數(shù),這個函數(shù)有兩個節(jié)點(diǎn)node和sum,它的含義是,求出從node開始的,路徑上各節(jié)點(diǎn)之和為sum的這樣的路徑的個數(shù)。注意是從node開始的。
result初始化為0。如果當(dāng)前node的value等于sum,則將result加1。由于可能會有負(fù)數(shù)節(jié)點(diǎn),因此不能立刻返回result,應(yīng)該分別再遞歸的去計(jì)算以node的左孩子和右孩子為起點(diǎn),和為sum-node.value的路徑的數(shù)目。
代碼如下:
def path_num_from(self, node, sum): if node is None: return 0 res = 0 if node.val == sum: res += 1 res += self.path_num_from(node.left, sum - node.val) res += self.path_num_from(node.right, sum - node.val) return res
之前已經(jīng)提到過,本題所求的路徑不僅包含以根節(jié)點(diǎn)為起點(diǎn)的路徑,還包含不以根節(jié)點(diǎn)為起點(diǎn)的路徑。因此我們再定義一個函數(shù),來算出,包含根節(jié)點(diǎn)的路徑,和不包含根節(jié)點(diǎn)的路徑。
def __pathSum(self, node, sum): if node is None: return 0 return self.find_path(node, sum) + self.__pathSum(node.left, sum) + self.__pathSum(node.right, sum)
題目得解。
第二道題:
給定一個數(shù),將其拆分為n個平方數(shù)的和,求最小的n。
例如13 = 9 + 4 13 = 9 + 1 + 1 + 1 + 1
13是9和4兩個平方數(shù)的和,也是9和4個1的和(如果用重復(fù),按出現(xiàn)的次數(shù)計(jì)數(shù),1計(jì)數(shù)4次而不是1次),因?yàn)?小于5,所以返回2。
這道題不能用貪心算法求解。
當(dāng)n=12時,如果用貪心算法,結(jié)果就是9+1+1+1,返回4。但是更優(yōu)的解是4+4+4,返回3。
假設(shè)給出的數(shù)字為n。先建立一個set。set中存放所有的,小于n的平方數(shù)。
比如給出數(shù)字13時,set中添加1,4,9。因?yàn)?6大于13,所以不添加。
以15舉例。set為 1,4,9。建立一個隊(duì)列。
第一輪:
15減去9,得到6。將6放入隊(duì)列中。
15減去4,得到11。將11放入隊(duì)列中。
15減去1,得到14,將14放入隊(duì)列中。
第一輪遍歷完畢。此時隊(duì)列中還有6,11,14
第二輪:
6比9小,所以不能再減9。
6減4,得到2,將2放入隊(duì)列中。
6減1,得到5,將5放入隊(duì)列中。
11減9,得到2,將2放入隊(duì)列中。
11減4,得到7,將7放入隊(duì)列中。
11減1,得到10,將10放入隊(duì)列中。
第二輪遍歷完畢。去掉重復(fù)的數(shù),此時隊(duì)列中還有2,5,7,10。
第三輪:
2減1,得到1,將1放入隊(duì)列中。
5減4,得到1,將1放入隊(duì)列中。
5減1,得到4,將4放入隊(duì)列中。
7減4,得到3,將3放入隊(duì)列中。
7減1,得到6,將6放入隊(duì)列中。
10減4,得到6,將6放入隊(duì)列中。
10減1,得到9,將9放入隊(duì)列中。
第三輪遍歷完畢。去掉重復(fù)元素,此時隊(duì)列中還有1,3,4,6,9。
第四輪:
1減1,得到0。結(jié)束循環(huán)。直接返回此時層數(shù)。由于遍歷了四輪,因此返回4。
代碼如下:
def numSquares(self, n): nums_to_subtract = [] i = 1 while i**2 <= n: nums_to_subtract.append(i**2) i += 1 depth = 0 current_level_nodes = {n} while True: nodes = current_level_nodes current_level_nodes = set() depth += 1 for num_left in nodes: for num in nums_to_subtract: if num_left < num: break elif num_left > num: current_level_nodes.add(num_left - num) else: return depth
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44635.html
摘要:既然說到地址空間了就順帶說一下上面環(huán)形鏈表這道題的另一種很的解法吧。介紹完常規(guī)操作鏈表的一些基本知識點(diǎn)后,現(xiàn)在回到快慢指針。 ??前幾天第一次在 Segmentfault 發(fā)文—JavaScript:十大排序的算法思路和代碼實(shí)現(xiàn),發(fā)現(xiàn)大家似乎挺喜歡算法的,所以今天再分享一篇前兩個星期寫的 Leetcode 刷題總結(jié),希望對大家能有所幫助。 ??本文首發(fā)于我的blog 前言 ??今天終于...
摘要:如果沒有,就到里面復(fù)雜度分析就是,因?yàn)橹粧吡艘槐閿?shù)組。復(fù)雜度分析當(dāng)然就是最壞情況了,也是標(biāo)準(zhǔn)的雙指針復(fù)雜度。復(fù)雜度分析這種題應(yīng)該不太需要分析復(fù)雜度吧,能實(shí)現(xiàn)就行。復(fù)雜度分析還是最后再說兩句所以可以看出,很多題目思路一致,換湯不換藥。 Two Sum 友情提示:篇幅較長,找題目的話,右邊有目錄,幸好我會MarkDown語法。改成了系列模式,因?yàn)轭愃频念}不少,本質(zhì)上都是換殼,所以在同一篇文...
摘要:月下半旬攻略道題,目前已攻略題。目前簡單難度攻略已經(jīng)到題,所以后面會調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時,攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區(qū)別...
閱讀 650·2021-10-13 09:39
閱讀 1456·2021-09-09 11:53
閱讀 2649·2019-08-29 13:55
閱讀 725·2019-08-28 18:08
閱讀 2597·2019-08-26 13:54
閱讀 2411·2019-08-26 11:44
閱讀 1839·2019-08-26 11:41
閱讀 3782·2019-08-26 10:15