整数数组 arr 由 n 个非负整数组成。
经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。
给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。
请解码返回原数组 arr 。可以证明答案存在并且是唯一的。
输入:encoded = [1,2,3], first = 1
输出:[1,0,2,1]
解释:若 arr = [1,0,2,1] ,那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]
输入:encoded = [6,2,7,3], first = 4
输出:[4,2,0,7,4]
2 <= n <= 104
encoded.length == n - 1
0 <= encoded[i] <= 10 ^ 5
0 <= first <= 10 ^ 5
class Solution:
def decode(self, encoded: List[int], first: int) -> List[int]:
if(not encoded): return []
temp = first
res = [first]
for i in range(len(encoded)):
x = temp ^ encoded[i]
res.append(x)
temp = x
return res
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
输入:head = [1,2,3,4,5], k = 2
输出:[1,4,3,2,5]
输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出:[7,9,6,6,8,7,3,0,9,5]
输入:head = [1], k = 1
输出:[1]
输入:head = [1,2], k = 1
输出:[2,1]
输入:head = [1,2,3], k = 2
输出:[1,2,3]
链表中节点的数目是 n
1 <= k <= n <= 105
0 <= Node.val <= 100
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapNodes(self, head: ListNode, k: int) -> ListNode:
temp = head
res = []
while(temp):
res.append(temp.val)
temp = temp.next
k = k
tempa = res[k-1]
res[k-1] = res[-k]
res[-k] = tempa
cnt = 0
temp = head
while(temp):
temp.val = res[cnt]
cnt += 1
temp = temp.next
return head
1.边界情况需要注意的有
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapNodes(self, head: ListNode, k: int) -> ListNode:
temp = head
cnt = 1
second = None
if(not head or head.next == None): return head
if(k == 1):
first = head
while(temp):
if(second):
second = second.next
if(cnt + 1 == k):
first = temp
if(cnt - 1 == k):
second = head
temp = temp.next
cnt += 1
# 若前后指针错位
if(k + 1 > cnt // 2):
t = first
first = second
second = t
# 若需操作节点为第一个
if(k == 1 or k + 1== cnt):
tempa = head.next
tempb = second.next
head.next = None
if(tempa != tempb):
tempb.next = tempa
second.next = head
else:
tempb.next = head
head = tempb
return head
# 正常操作
if(first != second):
tempa = first.next
tempb = second.next
first.next = second.next
second.next = tempa
tempc = tempa.next
tempa.next = tempb.next
tempb.next = tempc
return head
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapNodes(self, head: ListNode, k: int) -> ListNode:
p,q,n=head,head,head
i=1
while n:
if ik:
q=q.next#倒数第k个
n=n.next
i+=1
p.val,q.val=q.val,p.val
return head
给你两个整数数组 source 和 target ,长度都是 n 。还有一个数组 allowedSwaps ,其中每个 allowedSwaps[i] = [ai, bi] 表示你可以交换数组 source 中下标为 ai 和 bi(下标从 0 开始)的两个元素。注意,你可以按 任意 顺序 多次 交换一对特定下标指向的元素。
相同长度的两个数组 source 和 target 间的 汉明距离 是元素不同的下标数量。形式上,其值等于满足 source[i] != target[i] (下标从 0 开始)的下标 i(0 <= i <= n-1)的数量。
在对数组 source 执行 任意 数量的交换操作后,返回 source 和 target 间的 最小汉明距离 。
输入:source = [1,2,3,4], target = [2,1,4,5], allowedSwaps = [[0,1],[2,3]]
输出:1
解释:source 可以按下述方式转换:
输入:source = [1,2,3,4], target = [1,3,2,4], allowedSwaps = []
输出:2
解释:不能对 source 执行交换操作。
source 和 target 间的汉明距离是 2 ,二者有 2 处元素不同,在下标 1 和下标 2 。
输入:source = [5,1,2,4,3], target = [1,5,4,2,3], allowedSwaps = [[0,4],[4,2],[1,3],[1,4]]
输出:0
class UnionFind:
def __init__(self, l):
self.father = {i:i for i in range(l)}
def find(self,x):
root = x
while self.father[root] != root:
root = self.father[root]
# 路径压缩
while x != root:
original_father = self.father[x]
self.father[x] = root
x = original_father
return root
def union(self,x,y):
root_x,root_y = self.find(x),self.find(y)
if root_x != root_y:
self.father[root_x] = root_y
def is_connected(self,x,y):
return self.find(x) == self.find(y)
class Solution:
def minimumHammingDistance(self, source: List[int], target: List[int], allowedSwaps: List[List[int]]) -> int:
temp = UnionFind(len(source))
for i in range(len(allowedSwaps)):
temp.union(allowedSwaps[i][0], allowedSwaps[i][1])
dic = defaultdict(list)
for i in range(len(source)):
a = temp.find(i)
dic[a].append(i)
res = 0
for k, v in dic.items():
print(k)
print(v)
#print(k)
a=[source[i] for i in v]
b=Counter([target[i] for i in v])
for c in a:
if b[c]>0:
b[c]-=1
else:
res+=1
return res
class UnionFind:
def __init__(self, l):
self.father = {i:i for i in range(l)}
def find(self,x):
root = x
while self.father[root] != root:
root = self.father[root]
# 路径压缩
while x != root:
original_father = self.father[x]
self.father[x] = root
x = original_father
return root
def union(self,x,y):
root_x,root_y = self.find(x),self.find(y)
if root_x != root_y:
self.father[root_x] = root_y
def is_connected(self,x,y):
return self.find(x) == self.find(y)
给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间。
请你将这些工作分配给 k 位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。
返回分配方案中尽可能 最小 的 最大工作时间 。
输入:jobs = [3,2,3], k = 3
输出:3
解释:给每位工人分配一项工作,最大工作时间是 3 。
输入:jobs = [1,2,4,7,8], k = 2
输出:11
解释:按下述方式分配工作:
1 号工人:1、2、8(工作时间 = 1 + 2 + 8 = 11)
2 号工人:4、7(工作时间 = 4 + 7 = 11)
最大工作时间是 11 。
1 <= k <= jobs.length <= 12
1 <= jobs[i] <= 10^7
class Solution:
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
l = len(jobs)
bit = [0] * (1 << l)
for i in range(1, 1 << l):
for j in range (l):
if(i & (1 << j) == 0): continue
temp = i - (1 << j)
bit[i] = bit[temp] + jobs[j]
break
dp = [[-1] * (1 << l) for _ in range(k)]
for i in range(1 << l):
dp[0][i] = bit[i]
for i in range(1, k):
for j in range(1 << l):
s = j
MIN_VAL = sys.maxsize
while s :
val = max(dp[i - 1][j - s], bit[s])
MIN_VAL = min(val, MIN_VAL)
s = (s - 1) & j
dp[i][j] = MIN_VAL
return dp[k-1][(1 << l) - 1]