1.兩數之和css
給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。java
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。node
思路1:暴力解題:固定一個數nums[i],而後讓target減nums[i] 若是在數組中且下標不等於i則返回[i,nums.index(target-nums[i)].python
時間複雜度:O(n^2)O(n2), 對於每一個元素,咱們試圖經過遍歷數組的其他部分來尋找它所對應的目標元素,這將耗費 O(n)O(n) 的時間。所以時間複雜度爲 O(n^2)O(n2)。c++
空間複雜度O(1)git
1 class Solution(object): 2 def twoSum(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: List[int] 7 """ 8 9 for i in range(len(nums)): 10 if (target-nums[i]) in nums and i!=nums.index(target-nums[i]): 11 return [i,nums.index(target-nums[i])]
思路2:藉助python的字典(內部實現藉助hash表) 把數組的下標放在字典的鍵,數組元素放在字典的值中 。時間複雜度O(n) 準確來講是O(2*n) 數組
1 class Solution(object): 2 def twoSum(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: List[int] 7 """ 8 data = {} 9 for idx, val in enumerate(nums): 10 if val not in data: 11 data[val] = [idx] 12 else: 13 tem=data[val] 14 tem.append(idx) 15 data[val] = tem 16 for each in data: 17 if (target - each in data) : 18 if data[target - each] != data[each]: 19 return [data[target - each][0], data[each][0]] 20 if len(data[each])==2: 21 return data[each] 22
思路3:在建立字典的同時一邊判斷字典中是否存在這個元素,一邊往字典中添加元素時間複雜度O(n) 比思路2 大約快20%app
1 class Solution(object): 2 def twoSum(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: List[int] 7 """ 8 data={} 9 for i in range(len(nums)): 10 if target-nums[i] in data: 11 return [i,data[target-nums[i]]] 12 data[nums[i]]=i
371 兩個整數之和函數
不使用運算符 +
和 -
,計算兩整數 a
、b
之和。spa
思路1:xor異或運算不產生進位,&元算結束後左移一位
1 class Solution(object): 2 def getSum(self, a, b): 3 """ 4 :type a: int 5 :type b: int 6 :rtype: int 7 """ 8 while b != 0: 9 carry = a & b 10 a = (a ^ b) % 0x100000000 11 b = (carry << 1) % 0x100000000 12 return a if a <= 0x7FFFFFFF else a | (~0x100000000+1)
633 兩個平方數之和
給定一個非負整數 c
,你要判斷是否存在兩個整數 a
和 b
,使得 a2 + b2 = c。
思路:若是用指針指向一個數,用c-a**2 而後開方,若是爲整數返回true 時間複雜度O(根號下n)
1 import math 2 class Solution(object): 3 def judgeSquareSum(self, c): 4 """ 5 :type c: int 6 :rtype: bool 7 """ 8 if c==0: 9 return True 10 for i in range(1,int(math.sqrt(c))+1): 11 tem=math.sqrt(c-i**2) 12 if tem.is_integer(): 13 return True 14 else: 15 continue 16 return False 17
15 三數之和(雙指針解法)
思路:每次固定一個變量i,而後使用兩個指針指向數組的i+1,數組尾部,若是三個數相加等於0返回,同時讓lr指針同時移動,若是s小於0,讓r減去1,不然讓l加1
時間複雜度O(n**2)
1 class Solution: 2 def threeSum(self, nums): 3 nums.sort() 4 res=[] 5 for i in range(len(nums)): 6 if i == 0 or nums[i]>nums[i-1]: 7 l = i+1 8 r = len(nums)-1 9 while l<r: 10 s=nums[i]+nums[l]+nums[r] 11 if s==0: 12 res.append([nums[i],nums[l],nums[r]]) 13 l+=1 14 r-=1 15 while l<r and nums[l]==nums[l+1]: 16 l+=1 17 while l<r and nums[r]==nums[r+1]: 18 r-=1 19 elif s>0: 20 r-=1 21 else: 22 l+=1 23 return res
16 最接近的三數之和
思路:雙指針法:固定一個變量i,而後分別移動l和r 時間複雜度O(n**2)
1 class Solution(object): 2 def threeSumClosest(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: int 7 """ 8 nums.sort() 9 tem=1000000 10 res=0 11 for i in range(len(nums)): 12 if i==0 or nums[i]>nums[i-1]: 13 l=i+1 14 r=len(nums)-1 15 while l<r: 16 s = nums[i]+nums[l]+nums[r] 17 if abs(s-target) < tem: 18 tem = abs(s-target) 19 res=s 20 elif s<target: 21 l+=1 22 else: 23 r-=1 24 return res
18 四數之和
1 class Solution: 2 def fourSum(self, nums, target): 3 """ 4 :type nums: List[int] 5 :type target: int 6 :rtype: List[List[int]] 7 """ 8 9 if not nums: 10 return [] 11 12 _4_sum_list = [] 13 nums.sort() 14 if nums[-1] * 4 < target: 15 return [] 16 for i in range(len(nums) - 3): 17 if nums[i] * 4 > target: 18 break 19 if i == 0 or nums[i] != nums[i - 1]: 20 ele = nums[i] 21 target_3_sum = target - ele 22 if nums[-1] * 3 < target_3_sum: 23 continue 24 for j in range(i + 1, len(nums) - 2): 25 ele2 = nums[j] 26 if ele2 * 3 > target_3_sum: 27 break 28 if j == i + 1 or ele2 != nums[j - 1]: 29 target_2_sum = target_3_sum - ele2 30 point_left = j + 1 31 point_right = len(nums) - 1 32 while point_left < point_right: 33 if nums[point_left] + nums[point_right] > target_2_sum: 34 point_right -= 1 35 elif nums[point_left] + nums[point_right] < target_2_sum: 36 point_left += 1 37 else: 38 aaa = [ele, ele2, nums[point_left], nums[point_right]] 39 _4_sum_list.append(aaa) 40 point_left += 1 41 point_right -= 1 42 while point_left < point_right and nums[point_left] == nums[point_left - 1]: 43 point_left += 1 44 while point_left < point_right and nums[point_right] == nums[point_right + 1]: 45 point_right -= 1 46 47 return _4_sum_list
445 兩數相加
思路:把列表中元素變成整數加減,而後從新構建鏈表(頭插法)
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def addTwoNumbers(self, l1, l2): 9 """ 10 :type l1: ListNode 11 :type l2: ListNode 12 :rtype: ListNode 13 """ 14 res = " " 15 res1 = " " 16 while l1: 17 res += str(l1.val) 18 l1=l1.next 19 while l2: 20 res1+=str(l2.val) 21 l2=l2.next 22 res.lstrip() 23 res1.lstrip() 24 tem=int(res1)+int(res) 25 first_node=ListNode(tem%10) 26 tem=tem//10 27 while tem: 28 node=ListNode(tem % 10) 29 tem=tem/10 30 node.next=first_node 31 first_node=node 32 return first_node
394兩個數組交集
給定兩個數組,編寫一個函數來計算它們的交集。
set的交集(&)並集(|)
1 class Solution(object): 2 def intersection(self, nums1, nums2): 3 """ 4 :type nums1: List[int] 5 :type nums2: List[int] 6 :rtype: List[int] 7 """ 8 return set(nums1)&set(nums2) 9
167兩數之和
給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。
函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
1 class Solution(object): 2 def twoSum(self, numbers, target): 3 """ 4 :type numbers: List[int] 5 :type target: int 6 :rtype: List[int] 7 """ 8 for i in range(len(numbers)): 9 if i==0: 10 l,r=i,len(numbers)-1 11 while l<r: 12 tem=numbers[l]+numbers[r] 13 if tem==target: 14 return [l+1,r+1] 15 elif tem<target: 16 l+=1 17 else: 18 19 r-=1 20
20.有效的括號
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需知足:
1 class Solution(object): 2 def isValid(self, s): 3 """ 4 :type s: str 5 :rtype: bool 6 """ 7 res=[] 8 for each in s: 9 if each=="(" or each=="{" or each =="[": 10 res.append(each) 11 if each==")" or each=="}" or each =="]": 12 if len(res)==0: 13 return False 14 tem=res.pop() 15 xx = "" 16 if tem=="(": 17 xx=")" 18 if tem=="{": 19 xx="}" 20 if tem=="[": 21 xx="]" 22 if xx==each: 23 continue 24 else: 25 return False 26 if len(res)==0: 27 return True 28 else: 29 return False 30 31 32 33 34
42 接雨水
給定 n 個非負整數表示每一個寬度爲 1 的柱子的高度圖,計算按此排列的柱子,下雨以後能接多少雨水。
思路:
1 class Solution(object): 2 def trap(self, height): 3 if not height: return 0 4 n, res = len(height), 0 5 left_max, right_max = [0] * n, [0] * n 6 7 left_max[0] = height[0] 8 for i in range(1, n): # 從左向右掃描一遍,求出每一個位置左邊最高的邊 9 left_max[i] = max(height[i], left_max[i - 1]) 10 11 right_max[n - 1] = height[n - 1] 12 for i in range(n - 2, -1, -1): # 從右向左掃描一遍,求出每一個位置右邊最高的邊 13 right_max[i] = max(height[i], right_max[i + 1]) 14 15 for i in range(1, n - 1): # 掃描每個位置,用當前位置左右最短的邊,做爲長度,並減去當前位置的值,就是當前位置的容量 16 res += min(left_max[i], right_max[i]) - height[i] 17 return res
2兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,而且它們的每一個節點只能存儲 一位 數字。
若是,咱們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您能夠假設除了數字 0 以外,這兩個數都不會以 0 開頭。
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def addTwoNumbers(self, l1, l2): 9 """ 10 :type l1: ListNode 11 :type l2: ListNode 12 :rtype: ListNode 13 """ 14 res = " " 15 res1 = " " 16 while l1: 17 res += str(l1.val) 18 l1=l1.next 19 while l2: 20 res1+=str(l2.val) 21 l2=l2.next 22 res.lstrip() 23 res=res[::-1] 24 res1.lstrip() 25 res1=res1[::-1] 26 tem=int(res1)+int(res) 27 first_node=ListNode(tem%10) 28 first=first_node 29 tem=tem//10 30 while tem: 31 node=ListNode(tem % 10) 32 tem=tem/10 33 first_node.next=node 34 first_node=first_node.next 35 return first 36
5最長迴文字符串
給定一個字符串 s
,找到 s
中最長的迴文子串。你能夠假設 s
的最大長度爲 1000。
動態規劃:時間複雜度O(n**2)
1 class Solution(object): 2 def longestPalindrome(self, s): 3 n = len(s) 4 res= [[0]*n for x in range(n)] 5 max_len=-1 6 max_val="" 7 for i in range(n): 8 for j in range(i,-1,-1): 9 if s[i]==s[j] and(i-j<2 or res[i-1][j+1]): 10 res[i][j]=1 11 if res[i][j] and i-j+1>max_len: 12 max_len=i-j+1 13 max_val=s[j:i+1] 14 return max_val
214 最短迴文
給定一個字符串 s,你能夠經過在字符串前面添加字符將其轉換爲迴文串。找到並返回能夠用這種方式轉換的最短迴文串。
思路 字符串翻轉與源字符串比較
1 class Solution: 2 def shortestPalindrome(self, s: str) -> str: 3 if(len(s)==0): 4 return "" 5 s_reverse = s[::-1] 6 for i in range(len(s)): 7 if(s_reverse[i:len(s)] == s[0:len(s)-i]): 8 break 9 return s_reverse[0:i]+s
1 class Solution: 2 def lengthOfLongestSubstring(self, s): 3 """ 4 :type s: str 5 :rtype: int 6 """ 7 max_number = 0 8 number = 0 9 test = '' 10 for i in s: 11 if i not in test: 12 test += i 13 number += 1 14 else: 15 if number >= max_number: 16 max_number = number 17 index = test.index(i) 18 test = test[(index+1):] + i 19 number = len(test) 20 if number > max_number: 21 max_number = number 22 return max_number
1 class Solution(object): 2 def longestCommonPrefix(self, strs): 3 """ 4 :type strs: List[str] 5 :rtype: str 6 """ 7 res='' 8 if len(strs)==0: 9 return res 10 lens=min([len(x) for x in strs]) 11 for i in range(lens): 12 tem=strs[0][i] 13 for j in range(1,len(strs)): 14 if strs[j][i]!=tem: 15 return res 16 res+=tem 17 return res 18 19 20 21
7.整數翻轉
1 class Solution(object): 2 def reverse(self, x): 3 4 flag=False 5 if x < 0: 6 flag = True 7 temp = abs(x) 8 9 temp = int(str(temp)[::-1]) 10 if temp>2147483647: 11 return 0 12 if flag: 13 return -temp 14 else: 15 return temp 16
9迴文數
1 class Solution(object): 2 def isPalindrome(self, x): 3 """ 4 :type x: int 5 :rtype: bool 6 """ 7 s1=str(x) 8 s2=s1[::-1] 9 if s2==s1: 10 return True 11 else: 12 return False 13
11.最多盛水容器
給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。
1 class Solution(object): 2 def maxArea(self, height): 3 res=0 4 l,r=0,len(height)-1 5 while l < r: 6 res = max(res, min(height[l],height[r])*(r-l)) 7 if height[l]<height[r]: 8 l += 1 9 else: 10 r-=1 11 return res 12
6.N字形變換
思路:真難
1 class Solution(object): 2 def convert(self, s, numRows): 3 """ 4 :type s: str 5 :type numRows: int 6 :rtype: str 7 """ 8 if numRows == 1: 9 return s 10 zigzag = ['' for i in range(numRows)] # 初始化zigzag爲['','',''] 11 row = 0 # 當前的行數 12 step = 1 # 步數:控制數據的輸入 13 for c in s: 14 if row == 0: 15 step = 1 16 if row == numRows - 1: 17 step = -1 18 zigzag[row] += c 19 row += step 20 return ''.join(zigzag)
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def mergeTwoLists(self, l1, l2): 9 """ 10 :type l1: ListNode 11 :type l2: ListNode 12 :rtype: ListNode 13 """ 14 15 node=ListNode(None) 16 first=node 17 while l1 and l2: 18 if l1.val<=l2.val: 19 node.next=l1 20 l1=l1.next 21 22 else: 23 node.next=l2 24 l2=l2.next 25 node=node.next 26 if l1: 27 node.next=l1 28 if l2: 29 node.next=l2 30 return first.next 31 32
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def mergeKLists(self, lists): 9 """ 10 :type lists: List[ListNode] 11 :rtype: ListNode 12 """ 13 res=[] 14 for each in lists: 15 while each: 16 res.append(each.val) 17 each=each.next 18 res.sort() 19 first=ListNode(None) 20 nodes=first 21 for each in res: 22 node=ListNode(each) 23 first.next=node 24 first=first.next 25 return nodes.next 26
39組合總數
給定一個無重複元素的數組 candidates
和一個目標數 target
,找出 candidates
中全部可使數字和爲 target
的組合。
candidates
中的數字能夠無限制重複被選取。
1 class Solution(object): 2 def combinationSum(self, candidates, target): 3 """ 4 :type candidates: List[int] 5 :type target: int 6 :rtype: List[List[int]] 7 """ 8 self.resList = [] 9 candidates = sorted(candidates) 10 self.dfs(candidates,[],target,0) 11 return self.resList 12 def dfs(self, candidates, sublist, target, last): 13 if target == 0: 14 self.resList.append(sublist[:]) 15 if target< candidates[0]: 16 return 17 for n in candidates: 18 if n > target: 19 return 20 if n < last: 21 continue 22 sublist.append(n) 23 self.dfs(candidates,sublist,target - n, n) 24 sublist.pop() 25
思路一:遞歸 93 131
1 class Solution(object): 2 3 def letterCombinations(self, digits): 4 """ 5 :type digits: str 6 :rtype: List[str] 7 """ 8 self.res=[] 9 10 self.data={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'} 11 12 if len(digits)==0: 13 return [] 14 teem="" 15 self.f(digits,0,teem) 16 return self.res 17 18 19 def f(self,digits,index,ss): 20 if index==len(digits): 21 self.res.append(ss) 22 return 23 chars= self.data[digits[index]] 24 for i in range(len(chars)): 25 self.f(digits,index+1,ss+chars[i]) 26 return 27 28 29 30
1 class Solution(object): 2 def restoreIpAddresses(self, s): 3 """ 4 :type s: str 5 :rtype: List[str] 6 """ 7 res = [] 8 self.dfs(s, [], res) 9 return res 10 11 def dfs(self, s, path, res): 12 if len(s) > (4 - len(path)) * 3: 13 return 14 if not s and len(path) == 4: 15 res.append('.'.join(path)) 16 return 17 for i in range(min(3, len(s))): 18 curr = s[:i+1] 19 if (curr[0] == '0' and len(curr) >= 2) or int(curr) > 255: 20 continue 21 self.dfs(s[i+1:], path + [s[:i+1]], res)
1 class Solution(object): 2 def partition(self, s): 3 self.isPalindrome = lambda s : s == s[::-1] 4 res = [] 5 self.helper(s, res, []) 6 return res 7 8 def dfs(self, s, res, path): 9 if not s: 10 res.append(path) 11 return 12 for i in range(1, len(s) + 1): #注意起始和結束位置 13 if self.isPalindrome(s[:i]): 14 self.dfs(s[i:], res, path + [s[:i]])
思路:回溯
1 class Solution(object): 2 def permute(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: List[List[int]] 6 """ 7 visited = [0] * len(nums) 8 res = [] 9 10 def dfs(path): 11 if len(path) == len(nums): 12 res.append(path) 13 else: 14 for i in range(len(nums)): 15 if not visited[i]: 16 visited[i] = 1 17 dfs(path + [nums[i]]) 18 visited[i] = 0 19 20 dfs([]) 21 return res
思路2:
1 from itertools import permutations 2 class Solution(object): 3 def permute(self, nums): 4 """ 5 :type nums: List[int] 6 :rtype: List[List[int]] 7 """ 8 return list(permutations(nums))
思路:回溯
1 class Solution(object): 2 def letterCasePermutation(self, S): 3 4 self.res = [] 5 if len(S) == 0: 6 return [ ] 7 self.dfs(0, "",S) 8 return self.res 9 10 def dfs(self,start, temp,S): 11 if start == len(S) or len(temp) == len(S): 12 self.res.append(temp) 13 return 14 # print start, temp 15 if S[start].isdigit(): 16 self.dfs(start + 1, temp + S[start],S) 17 18 elif S[start].islower(): 19 self.dfs(start + 1, temp + S[start],S) 20 self.dfs(start + 1, temp + S[start].upper(),S) 21 22 elif S[start].isupper(): 23 self.dfs(start + 1, temp + S[start],S) 24 self.dfs(start + 1, temp + S[start].lower(),S) 25 return 26
思路:回溯法+DFS
1 class Solution(object): 2 def combine(self, n, k): 3 self.res = [] 4 data=list(range(1,n+1)) 5 ss=[] 6 self.dfs(data,ss,k) 7 return self.res 8 def dfs(self,s,ss,k): 9 if k == 0: 10 self.res.append(ss) 11 return 12 for i in range(len(s)): 13 self.dfs(s[i+1:],ss+[s[i]],k-1) 14 return
78子集
給定一組不含重複元素的整數數組 nums,返回該數組全部可能的子集(冪集)。
說明:解集不能包含重複的子集。
1 class Solution(object): 2 def subsets(self, nums): 3 res = [[]] 4 for num in nums: 5 for temp in res[:]: 6 x = temp[:] 7 x.append(num) 8 res.append(x) 9 return res
1 class Solution(object): 2 def combinationSum3(self, k, n): 3 self.res=[] 4 self.dfs([],k,n) 5 return self.res 6 def dfs(self,ss,k,n): 7 if k == 0 and sum(ss) == n: 8 self.res.append(ss) 9 return 10 start = ss[-1] if ss else 0 11 for i in range(start+1,10): 12 if sum(ss)+i>n: 13 continue 14 self.dfs(ss+[i],k-1,n) 15 return
給定一個數組 candidates
和一個目標數 target
,找出 candidates
中全部可使數字和爲 target
的組合。
candidates
中的每一個數字在每一個組合中只能使用一次。
說明:
思路:回溯+DFS
1 class Solution(object): 2 def combinationSum2(self, candidates, target): 3 self.res = [] 4 candidates.sort() 5 self.dfs(candidates,target,0,[]) 6 return self.res 7 def dfs(self,data,target,index,ss): 8 if target == 0 and ss not in self.res: 9 self.res.append(ss) 10 for i in range(index, len(data)): 11 if data[i] > target: 12 return 13 self.dfs(data, target - data[i], i + 1, ss + [data[i]])
94 二叉樹中序遍歷
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def inorderTraversal(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: List[int] 13 """ 14 res=[] 15 if root==None: 16 return [] 17 if root.left: 18 res+=self.inorderTraversal(root.left) 19 res.append(root.val) 20 if root.right: 21 res+=self.inorderTraversal(root.right) 22 return res 23 24 25
給定一個整數數組 nums
,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
1 class Solution(object): 2 def maxSubArray(self, nums): 3 max_val=-float("inf") 4 maxendinghere=-float("inf") 5 for i in range(len(nums)): 6 max_val=max(max_val+nums[i],nums[i]) 7 maxendinghere = max(max_val, maxendinghere) 8 return maxendinghere 9 10
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。
問總共有多少條不一樣的路徑?
思路:動態規劃 構建dp表
1 class Solution(object): 2 def uniquePaths(self, m, n): 3 data=[[0]*n for x in range(m)] 4 for i in range(m): 5 6 for j in range(n): 7 if i==0 or j==0: 8 data[i][j]=1 9 else: 10 data[i][j]=data[i-1][j]+data[i][j-1] 11 return data[m-1][n-1] 12 13 14 15
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。
如今考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不一樣的路徑?
1 class Solution(object): 2 def uniquePathsWithObstacles(self, obstacleGrid): 3 m = len(obstacleGrid) 4 n = len(obstacleGrid[0]) 5 data = [[0]*n for x in range(m)] 6 if obstacleGrid[0][0] == 1: 7 data[0][0] = 0 8 else: 9 data[0][0] = 1 10 11 for i in range(1,m): 12 if obstacleGrid[i][0]==1: 13 data[i][0]=0 14 else: 15 data[i][0] = data[i-1][0] 16 17 for i in range(1,n): 18 if obstacleGrid[0][i]== 1: 19 continue 20 else: 21 data[0][i]=data[0][i-1] 22 23 for i in range(1,m): 24 for j in range(1,n): 25 if obstacleGrid[i][j]==1: 26 data[i][j]=0 27 else: 28 data[i][j]=data[i-1][j]+data[i][j-1] 29 return data[m-1][n-1]
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。
說明:每次只能向下或者向右移動一步。
思路:動態規劃
1 class Solution(object): 2 def minPathSum(self, grid): 3 m = len(grid) 4 n = len(grid[0]) 5 data = [[0] * n for x in range(m)] 6 data[0][0] = grid[0][0] 7 for i in range(1, m): 8 data[i][0] = data[i - 1][0] + grid[i][0] 9 for j in range(1, n): 10 data[0][j] = data[0][j - 1] + grid[0][j] 11 12 for i in range(1, m): 13 for j in range(1, n): 14 data[i][j] = min(data[i - 1][j], data[i][j - 1])+grid[i][j] 15 return data[m-1][n-1]
假設你正在爬樓梯。須要 n 階你才能到達樓頂。
每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?
思路:遞歸時間複雜度不行 仍是動態規劃
1 class Solution(object): 2 def climbStairs(self, n): 3 a,b,tem=1,2,0 4 if n<=2: 5 return n 6 7 for i in range(3,n+1): 8 tem=a+b 9 a=b 10 b=tem 11 return tem 12 13
思路:回溯法
1 class Solution(object): 2 def exist(self, board, word): 3 if not word: 4 return True 5 if not board: 6 return False 7 8 self.m = len(board) 9 self.n = len(board[0]) 10 self.indexs = [[-1, 0], [0, 1], [1, 0], [0, -1]] 11 12 self.visit = [[0]*self.n for _ in range(self.m)] 13 for i in range(self.m): 14 for j in range(self.n): 15 if self.search(board, word, 0, i, j): 16 return True 17 return False 18 19 def search(self,board, word, cur, row, col): 20 if word[cur] == board[row][col] : 21 if cur == len(word)-1: 22 return True 23 self.visit[row][col] = 1 24 for i in range(4): 25 new_x = row + self.indexs[i][0] 26 new_y = col + self.indexs[i][1] 27 if self.inArea(new_x, new_y) and not self.visit[new_x][new_y]: 28 if self.search(board, word, cur+1, new_x, new_y): 29 return True 30 self.visit[row][col] = 0 31 return False 32 33 def inArea(self, x, y): 34 return x >= 0 and x < self.m and y >= 0 and y < self.n
給定一個由 '1'
(陸地)和 '0'
(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,而且它是經過水平方向或垂直方向上相鄰的陸地鏈接而成的。你能夠假設網格的四個邊均被水包圍。
1 class Solution(object): 2 def numIslands(self, grid): 3 self.m = len(grid) 4 if len(grid)==0: 5 return 0 6 self.n = len(grid[0]) 7 self.res = 0 8 self.indexs = [[-1, 0], [0, 1], [1, 0], [0, -1]] 9 self.visit = [[0] * self.n for _ in range(self.m)] 10 for i in range(self.m): 11 for j in range(self.n): 12 13 if grid[i][j] == "1" and not self.visit[i][j]: 14 self.res += 1 15 self.f(grid, i, j) 16 return self.res 17 18 def inArea(self, x, y): 19 return x >= 0 and x < self.m and y >= 0 and y < self.n 20 21 def f(self,grid,start_x,start_y): 22 self.visit[start_x][start_y]=1 23 for i in range(4): 24 new_x = start_x + self.indexs[i][0] 25 new_y = start_y + self.indexs[i][1] 26 if self.inArea(new_x,new_y) and not self.visit[new_x][new_y] and grid[new_x][new_y]=="1": 27 self.f(grid,new_x,new_y) 28 return
思路:遞歸+floodfill
1 class Solution(object): 2 def solve(self, board): 3 if not len(board) or not len(board[0]): 4 return 5 self.m = len(board) 6 self.n = len(board[0]) 7 8 self.indexs = [[-1, 0], [0, 1], [1, 0], [0, -1]] 9 self.visit = [[0] * self.n for _ in range(self.m)] 10 for i in range(self.m): 11 if i == 0 or i == self.m-1: 12 for j in range(self.n): 13 self.f(board, i, j) 14 else: 15 self.f(board, i, 0) 16 self.f(board, i, self.n-1) 17 18 for i in range(self.m): 19 for j in range(self.n): 20 board[i][j] = "O" if board[i][j] == "*" else "X" 21 return board 22 def f(self, board, start_x, start_y): 23 if start_x < 0 or start_y < 0 or start_x >= self.m or start_y >= self.n or \ 24 board[start_x][start_y] == 'X' or board[start_x][start_y] == '*': 25 return 26 board[start_x][start_y] = "*" 27 for i in range(4): 28 self.f(board, start_x + self.indexs[i][0], start_y + self.indexs[i][1])
思路:從四個邊界入手採用floodfill進行填充
1 class Solution(object): 2 def pacificAtlantic(self, matrix): 3 if not matrix or not matrix[0]: 4 return [] 5 self.m, self.n = len(matrix), len(matrix[0]) 6 self.indexs = [[-1, 0], [0, 1], [1, 0], [0, -1]] 7 p_visited = [[0] * self.n for _ in range(self.m)] 8 a_visited = [[0] * self.n for _ in range(self.m)] 9 for i in range(self.m): 10 self.dfs(p_visited, matrix, i, 0) 11 self.dfs(a_visited, matrix, i, self.n - 1) 12 for j in range(self.n): 13 self.dfs(p_visited, matrix, 0, j) 14 self.dfs(a_visited, matrix, self.m - 1, j) 15 res = [] 16 for i in range(self.m): 17 for j in range(self.n): 18 if p_visited[i][j] and a_visited[i][j]: 19 res.append([i, j]) 20 return res 21 22 def dfs(self, visited, matrix, i, j): 23 visited[i][j] = 1 24 for each in self.indexs: 25 x, y = i + each[0], j + each[1] 26 if x < 0 or x >= self.m or y < 0 or y >= self.n or visited[x][y] or matrix[x][y] < matrix[i][j]: 27 continue 28 self.dfs(visited, matrix, x, y)
思路:DFS+回溯 保證列 兩個對角線上只有一個元素便可
1 class Solution(object): 2 def solveNQueens(self, n): 3 self.res=[] 4 self.f([],[],[],n) 5 return [["."*i+"Q"+"."*(n-i-1) for i in each ] for each in self.res] 6 def f(self,queens,diff,sum,n): 7 p=len(queens) 8 if p==n: 9 self.res.append(queens) 10 return 11 for q in range(n): 12 if q not in queens and q+p not in sum and p-q not in diff: 13 self.f(queens+[q],diff+[p-q],sum+[p+q],n) 14 15 16
52 N皇后II
思路:同上
1 class Solution(object): 2 def totalNQueens(self, n): 3 self.res = [] 4 self.f([], [], [], n) 5 return len(self.res) 6 def f(self, queens, diff, sum, n): 7 p = len(queens) 8 if p == n: 9 self.res.append(queens) 10 return 11 for q in range(n): 12 if q not in queens and q + p not in sum and p - q not in diff: 13 self.f(queens + [q], diff + [p - q], sum+[p + q], n) 14 15
思路:DFS+回溯 檢查行列以及3*3的小方格
1 class Solution: 2 def solveSudoku(self, board): 3 self.board = board 4 self.solve() 5 6 def solve(self): # 主遞歸函數 7 row, col = self.findUnassigned() # 獲取一個未被分配的方格 8 if row == -1 and col == -1: # 沒有找到,說明已經填好 9 return True 10 for num in ['1', '2', '3', '4', '5', '6', '7', '8', '9']: 11 if self.isSafe(row, col, num): # 循環填入數字,並判斷是否知足要求 12 self.board[row][col] = num 13 if self.solve(): # 遞歸進入下一個方格 14 return True 15 self.board[row][col] = '.' # 後續不知足,那麼如今要回復當前環境,並進行下一個數字試探 16 return False 17 18 def findUnassigned(self): # 依次查找未被分配的方格 19 for row in range(9): 20 for col in range(9): 21 if self.board[row][col] == '.': 22 return row, col 23 return -1, -1 24 25 def isSafe(self, row, col, ch): # 判斷是否當前方格填入的數字是否知足要求 26 boxrow = row - row % 3 # 肯定3x3小宮格的開始座標,就是3x3小宮格第一個方格索引 27 boxcol = col - col % 3 28 if self.checkrow(row, ch) and self.checkcol(col, ch) and self.checksquare(boxrow, boxcol, ch): 29 return True 30 return False 31 32 def checkrow(self, row, ch): # 檢查一行是否符合條件 33 for col in range(9): 34 if self.board[row][col] == ch: 35 return False 36 return True 37 38 def checkcol(self, col, ch): # 檢查一列是否符合條件 39 for row in range(9): 40 if self.board[row][col] == ch: 41 return False 42 return True 43 44 def checksquare(self, row, col, ch): # 檢查3x3小宮格是否符合條件 45 for r in range(row, row + 3): 46 for c in range(col, col + 3): 47 if self.board[r][c] == ch: 48 return False 49 return True 50 51 52 if __name__ == '__main__': 53 board = [ 54 ['5', '3', '.', '.', '7', '.', '.', '.', '.'], 55 ['6', '.', '.', '1', '9', '5', '.', '.', '.'], 56 ['.', '9', '8', '.', '.', '.', '.', '6', '.'], 57 ['8', '.', '.', '.', '6', '.', '.', '.', '3'], 58 ['4', '.', '.', '8', '.', '3', '.', '.', '1'], 59 ['7', '.', '.', '.', '2', '.', '.', '.', '6'], 60 ['.', '6', '.', '.', '.', '.', '2', '8', '.'], 61 ['.', '.', '.', '4', '1', '9', '.', '.', '5'], 62 ['.', '.', '.', '.', '8', '.', '.', '7', '9']] 63 64 solu = Solution() 65 solu.solveSudoku(board) 66 67 for v in board: 68 print(v)
343整數分解
給定一個正整數 n,將其拆分爲至少兩個正整數的和,並使這些整數的乘積最大化。 返回你能夠得到的最大乘積。
思路1:遞歸(超時)
1 class Solution(object): 2 def integerBreak(self, n): 3 if n == 2 or n == 1: 4 return 1 5 res = -1 6 for i in range(1, n): 7 res = max(res, i*(n-i), i*self.integerBreak(n-i)) 8 return res 9
思路2:記憶化搜索(超時)
1 class Solution(object): 2 def integerBreak(self, n): 3 memo=[-1 for x in range(n+1)] 4 if n == 1: 5 return 1 6 if memo[n]!= -1: 7 return memo[n] 8 res = -1 9 for i in range(1,n-1): 10 res = max(res, i*(n-i), i*self.integerBreak(n-i)) 11 memo[n]=res 12 return res
思路3:動態規劃
1 class Solution(object): 2 def integerBreak(self, n): 3 memo=[-1 for x in range(n+1)] 4 memo[1]=1 5 for i in range(2,n+1): 6 for j in range(1,i): 7 memo[i]=max(memo[i],j*(i-j),j*self.integerBreak(i-j)) 8 return memo[n]
思路:上面不經過居然由於「memo=[-1 for x in range(n+1)]」
1 class Solution(object): 2 def integerBreak(self, n): 3 dp = [-1]*(n+1) 4 dp[1] = 1 5 for i in range(2, n+1): 6 for j in range(1, i): 7 dp[i] = max(dp[i], j*(i-j), j*dp[i-j]) 8 return dp[n]
思路5:dp[i] = dp[i - 3] * 3
,當n >= 7時成立
1 class Solution(object): 2 def integerBreak(self, n): 3 dp = [0, 0, 1, 2, 4, 6, 9] 4 for i in range(7, n + 1): 5 dp.append(dp[i - 3] * 3) 6 return dp[n]
思路:回溯(超時)
1 class Solution(object): 2 def rob(self, nums): 3 return self.tryrob(nums,0) 4 def tryrob(self,data,index): 5 if index>=len(data): 6 return 0 7 res=0 8 for i in range(index,len(data)): 9 res=max(res,data[i]+self.tryrob(data,i+2)) 10 return res
思路:記憶話搜索(經過)
1 class Solution(object): 2 def rob(self, nums): 3 self.memo=[-1]*(len(nums)+1) 4 return self.tryrob(nums,0) 5 def tryrob(self,nums,index): 6 if index>=len(nums): 7 return 0 8 if self.memo[index]!=-1: 9 return self.memo[index] 10 res = 0 11 for i in range(index,len(nums)): 12 res=max(res,nums[i]+self.tryrob(nums,i+2)) 13 self.memo[index]=res 14 return res
思路:動態規劃(經過)公式:dp[i] = max(dp[i-2]+nums[i], dp[i-1])
1 class Solution(object): 2 def rob(self, nums): 3 if len(nums)==0: 4 return 0 5 self.memo = [-1]*len(nums) 6 self.memo[-1] = nums[-1] 7 for i in range(len(nums)-2,-1,-1): 8 for j in range(i,len(nums)): 9 self.memo[i] = max(self.memo[i], 10 nums[j]+(self.memo[j+2] if j+2 < len(nums) else 0)) 11 return self.memo[0]
思路:動態規劃 (不太懂)公式:dp[i] = max(dp[i-2]+nums[i], dp[i-1])
1 class Solution(object): 2 def rob(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 last = 0 8 now = 0 9 for i in nums: 10 #這是一個動態規劃問題 11 last, now = now, max(last + i, now) 12 return now 13
213 打擊結社2
思路:針對於環形問題能夠把數據分紅【0:n-1】和【1:n】便可
1 class Solution(object): 2 def rob(self, nums): 3 if len(nums)==1: 4 return nums[0] 5 if len(nums)==2: 6 return max(nums) 7 n=len(nums) 8 return max(self.f(nums[0:n-1]),self.f(nums[1:n])) 9 10 def f(self,nums): 11 if len(nums)==1: 12 return nums[0] 13 if len(nums)==2: 14 return max(nums) 15 n=len(nums) 16 dp=[0]*n 17 dp[0]=nums[0] 18 dp[1]=max(nums[0:2]) 19 for i in range(2,n): 20 dp[i]=max(dp[i-1],dp[i-2]+nums[i]) 21 return dp[-1]
1 class Solution(object): 2 def lengthOfLIS(self, nums): 3 if len(nums)==0: 4 return 0 5 dp=[1]*len(nums) 6 for i in range(1,len(nums)): 7 for j in range(i): 8 if nums[j]<nums[i]: 9 dp[i]=max(dp[i],dp[j]+1) 10 return max(dp)
139 單詞拆分
動態規劃
1 class Solution(object): 2 def wordBreak(self, s, wordDict): 3 """ 4 :type s: str 5 :type wordDict: List[str] 6 :rtype: bool 7 """ 8 if len(s)==1: 9 return False 10 n=len(s) 11 dp=[0]*(n+1) 12 dp[0]=1 13 for i in range(1,n+1): 14 for j in range(i): 15 if s[j:i] in wordDict and dp[j]: 16 dp[i]=1
91解碼方式
思路:動態規劃
1 class Solution(object): 2 def numDecodings(self, s): 3 if not s or s[0] == '0': 4 return 0 5 dp = [1, 1] 6 for i in range(1, len(s)): 7 if s[i] == '0': 8 if (s[i-1] == '1' or s[i-1] == '2'): #匹配「10」和「20」 9 dp.append(dp[-2]) 10 else: 11 return 0 12 elif s[i-1] == '1' or (s[i-1] == '2' and s[i] <= '6'): #匹配「1x」和「2x"狀況,固然得小於26; 13 dp.append(dp[-1] + dp[-2]) 14 else: 15 dp.append(dp[-1]) 16 return dp[-1] 17
給定一個整數數組 nums
,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。
1 class Solution(object): 2 def maxProduct(self, nums): 3 if len(nums)==0: 4 return 0 5 if len(nums)==1: 6 return nums[0] 7 tem_max,tem_min=0,0 8 res=nums[0] 9 for each in nums: 10 temp=tem_max 11 tem_max=max(each ,each*tem_max,each*tem_min) 12 tem_min=min(each ,each*tem_min,each*temp) 13 res=max(res,tem_min,tem_max) 14 return res 15
給定一個二叉樹,判斷它是不是高度平衡的二叉樹。
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def isBalanced(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: bool 13 """ 14 if not root: 15 return True 16 rights=self.getdepth(root.right) 17 lefts=self.getdepth(root.left) 18 if abs(rights-lefts)>1: 19 return False 20 return self.isBalanced(root.left) and self.isBalanced(root.right) 21 def getdepth(self,root): 22 if not root: 23 return 0 24 return max(self.getdepth(root.left),self.getdepth(root.right))+1 25
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def isSameTree(self, p, q): 10 """ 11 :type p: TreeNode 12 :type q: TreeNode 13 :rtype: bool 14 """ 15 if p==None and q==None: 16 return True 17 if p!=None and q!=None and q.val==p.val: 18 return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right) 19 else: 20 return False 21 22 23
101 對稱二叉樹
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def isSymmetric(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: bool 13 """ 14 return self.isMirror(root,root) 15 def isMirror(self,t1,t2): 16 if not t1 and not t2: 17 return True 18 elif t1 != None and t2 != None: 19 if t1.val == t2.val: 20 return self.isMirror(t1.right,t2.left) and self.isMirror(t1.left,t2.right) 21 else: 22 return False 23 else: 24 return False 25
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def minDepth(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: int 13 """ 14 if not root: 15 return 0 16 left=self.minDepth(root.left) 17 right=self.minDepth(root.right) 18 return 1+min(left,right) if (left and right) else 1+left+right
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def hasPathSum(self, root, sum): 10 """ 11 :type root: TreeNode 12 :type sum: int 13 :rtype: bool 14 """ 15 16 if not root : 17 return False 18 if root.left==None and root.right==None: 19 return sum-root.val==0 20 return self.hasPathSum(root.left,sum-root.val) or self.hasPathSum(root.right,sum-root.val)
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def binaryTreePaths(self, root): """ :type root: TreeNode :rtype: List[str] """ res=[] # 不能用self.res[],由於每個實例只有一個該屬性。然而本題須要不斷遞歸調用須要建立不少的res if not root: return res if not root.left and not root.right: res.append(str(root.val)) return res for each in self.binaryTreePaths(root.left): res.append(str(root.val)+"->"+each) for each in self.binaryTreePaths(root.right): res.append(str(root.val)+"->"+each) return res
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def sumNumbers(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: int 13 """ 14 num=0 15 res=self.binaryTreePaths(root) 16 for each in res: 17 num+=int(each) 18 return num 19 20 def binaryTreePaths(self, root): 21 22 res=[] 23 if not root: 24 return res 25 if not root.left and not root.right: 26 res.append(str(root.val)) 27 return res 28 for each in self.binaryTreePaths(root.left): 29 res.append(str(root.val)+each) 30 for each in self.binaryTreePaths(root.right): 31 res.append(str(root.val)+each) 32 return res
給定一個二叉樹和一個目標和,找到全部從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定以下二叉樹,以及目標和 sum = 22
,
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def pathSum(self, root, sum): 10 """ 11 :type root: TreeNode 12 :type sum: int 13 :rtype: List[List[int]] 14 """ 15 if not root: 16 return [] 17 def dfs(root,sum,ans,temp): 18 if root==None: 19 return [] 20 temp.append(root.val) 21 if root.left==None and root.right==None and sum==root.val: 22 ans.append(temp[:]) 23 dfs(root.left,sum-root.val,ans,temp) 24 dfs(root.right,sum-root.val,ans,temp) 25 temp.pop() 26 ans=[] 27 temp=[] 28 dfs(root,sum,ans,temp) 29 return ans 30 31 32 33 34
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def pathSum(self, root, sum): 10 """ 11 :type root: TreeNode 12 :type sum: int 13 :rtype: int 14 """ 15 if not root: 16 return 0 17 res=self.findPath(root,sum) 18 res+=self.pathSum(root.left,sum) 19 res+=self.pathSum(root.right,sum) 20 return res 21 def findPath(self,root,sum): 22 if not root: 23 return 0 24 res=0 25 if root.val==sum: 26 res+=1 27 res+=self.findPath(root.left,sum-root.val) 28 res+=self.findPath(root.right,sum-root.val) 29 return res 30 31
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def lowestCommonAncestor(self, root, p, q): 10 """ 11 :type root: TreeNode 12 :type p: TreeNode 13 :type q: TreeNode 14 :rtype: TreeNode 15 """ 16 if not root: 17 return 18 if p.val<root.val and q.val<root.val: 19 return self.lowestCommonAncestor(root.left,p,q) 20 if p.val>root.val and q.val>root.val: 21 return self.lowestCommonAncestor(root.right,p,q) 22 return root 23
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def __init__(self): 10 self.last=-float("inf") # 放在內部每次都會生成 11 def isValidBST(self, root): 12 """ 13 :type root: TreeNode 14 :rtype: bool 15 """ 16 if not root: 17 return True 18 if self.isValidBST(root.left): 19 if root.val>self.last: 20 self.last=root.val 21 return self.isValidBST(root.right) 22 return False
class Solution(object): def jump(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums)==1: return 0 reach=0 step=0 next_search=nums[0] for i in range(len(nums)): next_search=max(nums[i]+i,next_search) if next_search>=len(nums)-1: return step+1 if reach==i: step+=1 reach=next_search return step
1 class Solution(object): 2 def topKFrequent(self, nums, k): 3 """ 4 :type nums: List[int] 5 :type k: int 6 :rtype: List[int] 7 """ 8 d = {} 9 for val in nums: 10 if val not in d: 11 d[val] = 0 12 else: 13 d[val] += 1 14 return [x[0] for x in sorted(d.items(), reverse=True, key=lambda x: x[1])[:k]] 15 16 17
思路:
1 from collections import Counter 2 class Solution(object): 3 def topKFrequent(self, nums, k): 4 return [x[0] for x in Counter(nums).most_common(k)]
在上次打劫完一條街道以後和一圈房屋後,小偷又發現了一個新的可行竊的地區。這個地區只有一個入口,咱們稱之爲「根」。 除了「根」以外,每棟房子有且只有一個「父「房子與之相連。一番偵察以後,聰明的小偷意識到「這個地方的全部房屋的排列相似於一棵二叉樹」。 若是兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
計算在不觸動警報的狀況下,小偷一晚可以盜取的最高金額。
思路:遞歸:python超時 java c++能夠經過
1 class Solution(object): 2 def rob(self, root): 3 """ 4 :type root: TreeNode 5 :rtype: int 6 """ 7 if not root: 8 return 0 9 res = 0 10 if root.left != None: 11 res = res + self.rob(root.left.left) + self.rob(root.left.right) 12 if root.right: 13 res=res+self.rob(root.right.left)+self.rob(root.right.right) 14 return max(root.val+res,self.rob(root.left)+self.rob(root.right))
思路2:動態規劃
1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution(object): 9 def rob(self, root): 10 """ 11 :type root: TreeNode 12 :rtype: int 13 """ 14 res=self.f(root) 15 return max(res) 16 def f(self,root): 17 if not root: 18 return [0,0] 19 left=self.f(root.left) 20 right=self.f(root.right) 21 res=[0]*2 22 23 res[0]=max(left[0],left[1])+max(right[0],right[1]) 24 res[1]=root.val+left[0]+right[0] 25 return res
1 class Solution(object): 2 def canMeasureWater(self, x, y, z): 3 """ 4 :type x: int 5 :type y: int 6 :type z: int 7 :rtype: bool 8 """ 9 if z == 0: 10 return True 11 if x+y < z: 12 return False 13 if x>y: 14 x,y=y,x 15 if x == 0: 16 return y==z 17 while y%x != 0: 18 y,x = x,y%x 19 return z%x==0 20
1 class Solution(object): 2 def minDistance(self, word1, word2): 3 4 dp = [[0] * (len(word2)+1) for x in range(len(word1)+1)] 5 dp[0][0]=0 6 7 for i in range(1,len(word1)+1): 8 for j in range(1,len(word2)+1): 9 if word1[i-1]==word2[j-1]: 10 dp[i][j]=dp[i-1][j-1]+1 11 else: 12 dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 13 return len(word2)+len(word1)-2*dp[-1][-1]
思路:取列表中最大元素和平均D天運出去的均值的最大值做爲出發點,進行遍歷。運行時間有點慢
1 class Solution(object): 2 def shipWithinDays(self, weights, D): 3 """ 4 :type weights: List[int] 5 :type D: int 6 :rtype: int 7 """ 8 res=max(sum(weights)//D,max(weights)) 9 while True: 10 n=1 11 temp=0 12 for each in weights: 13 if temp+each<=res: 14 temp+=each 15 else: 16 temp=each 17 n+=1 18 if n>D: 19 break 20 if n<=D: 21 return res 22 else: 23 res+=1 24 return res 25
思路:創建一個包含60個元素的字典,鍵表明歌曲播放時間對60取餘數,值是出現的次數
class Solution(object): def numPairsDivisibleBy60(self, time): """ :type time: List[int] :rtype: int """ if len(time)<2: return 0 c=dict(zip(range(60),[0]*60)) for each in time: c[each%60]+=1 ans=c[0]*(c[0]-1)/2+c[30]*(c[30]-1)/2 for i in range(1,30): ans+=c[i]*c[60-i] return ans
c++代碼
1 class Solution { 2 public: 3 int numPairsDivisibleBy60(vector<int>& time) { 4 int a[60]={0}; 5 for (int t:time){ 6 a[t%60]++; 7 } 8 int ans=a[0]*(a[0]-1)/2+a[30]*(a[30]-1)/2; 9 for (int i=1;i<30;i++) 10 ans+=a[i]*a[60-i]; 11 return ans; 12 } 13 14 };