二叉树的最大宽度:力扣
先横向统计每一层的节点编号然后,然后每一层对比得出最短的那个
一个编号为 index 的左子节点的编号记为 2×index,右子节点的编号记为 2×index+1
class Solution:
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
res = 1
arr = [[root, 1]]
while arr:
tmp = []
for node, index in arr:
if node.left:
tmp.append([node.left, index * 2])
if node.right:
tmp.append([node.right, index * 2 + 1])
res = max(res, arr[-1][1] - arr[0][1] + 1) //每次进行比较
arr = tmp //不管比较结果,直接进入下一层
return res
单词拆分:力扣
开头标记为1,其它标记为0 到了一个单词的结尾,就把下一个字母标记为1,这期间是遍历
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
n=len(s)
dp=[False]*(n+1)
dp[0]=True
for i in range(n):
for j in range(i+1,n+1):
if(dp[i] and (s[i:j] in wordDict)):
dp[j]=True
return dp[-1]
旋转排序数组中最小值:力扣
如果前一个全小于后一个,就没有旋转,返回
如果---------有一个---------------旋转了,---------
---------------超过一个------------没有-------,-----
但是要求了复杂度
class Solution:
def findMin(self, nums: List[int]) -> int:
low, high = 0, len(nums) - 1
while low < high:
pivot = low + (high - low) // 2
if nums[pivot] < nums[high]:
high = pivot
else:
low = pivot + 1
return nums[low]
复制带随机指针的链表:力扣
难点在于复制随机指针
先在每个原节点后面创建一模一样的新节点,然后新节点的随机指针开始设置(i原节点指向j原节点,那么i新节点指向j原节点的next p.next.random = p.random.next), 然后把新链表摘出来就好了
class Solution(object):
def copyRandomList(self, head):
if not head:
return None
p = head
# 第一步,在每个原节点后面创建一个新节点
# 1->1'->2->2'->3->3'
while p:
new_node = Node(p.val,None,None)
new_node.next = p.next
p.next = new_node
p = new_node.next
p = head
# 第二步,设置新节点的随机节点
while p:
if p.random:
p.next.random = p.random.next
p = p.next.next
# 第三步,将两个链表分离
p = head
dummy = Node(-1,None,None)
cur = dummy
while p:
cur.next = p.next
cur = cur.next
p.next = cur.next
p = p.next
return dummy.next
移动零:力扣
两个指针ij,用i来遍历,j来在原数组中复写非0的元素(i遇见不是0的就传值给j)直到i遍历完,从j的此刻开始,往后面都写成0
class Solution(object):
def moveZeroes(self, nums):
if not nums:
return 0
# 第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
j = 0
for i in xrange(len(nums)):
if nums[i]:
nums[j] = nums[i]
j += 1
# 非0元素统计完了,剩下的都是0了
# 所以第二次遍历把末尾的元素都赋为0即可
for i in xrange(j,len(nums)):
nums[i] = 0
两两交换链表中的节点:力扣
递归:终止条件是只有一个或者没有节点,两两交换链表,
用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。然后令 newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点 newHead
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
newHead = head.next
head.next = self.swapPairs(newHead.next)
newHead.next = head
return newHead
迭代:
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
dummyHead = ListNode(0)
dummyHead.next = head
temp = dummyHead
while temp.next and temp.next.next:
node1 = temp.next
node2 = temp.next.next
temp.next = node2
node1.next = node2.next
node2.next = node1
temp = node1
return dummyHead.next
排序数组:力扣
最大数:力扣
class Solution:
def largestNumber(self, nums: List[int]) -> str:
strs = map(str, nums)
def cmp(a, b):
if a + b == b + a:
return 0
elif a + b > b + a:
return 1
else:
return -1
strs = sorted(strs, key=functools.cmp_to_key(cmp), reverse=True)
return ''.join(strs) if strs[0] != '0' else '0'