2022.将一维数组转变成二维数组
给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。
original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都包含 )的元素构成二维数组的第二行,依此类推。
请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。
解答 :
class Solution: def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]: res = [] if len(original) != m * n: return res else: #每次添加n个元素进去,则采取步长的方式,m行n列,每次选择n个数,步长选为n for i in range(0,len(original),n): res.append(original[i:i+n]) return res
class Solution: def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]: return [original[i: i + n] for i in range(0, len(original), n)] if len(original) == m * n else []
复杂度:
时间复杂度:O(mn) 。
空间复杂度:O(1)。不考虑返回值的空间占用
390.消除数字
列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序。请你对 arr 应用下述算法:
从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
给你整数 n ,返回 arr 最后剩下的数字。
解答:
class Solution:
def lastRemaining(self, n: int) -> int:
head = 1
step = 1
left = True
while n > 1:
# 从左边开始移除 or(从右边开始移除,数列总数为奇数)
if left or n % 2 != 0:
head += step
step <<= 1 # 步长 * 2
n >>= 1 # 总数 / 2
left = not left #取反移除方向
return head
分析:leetcode链接
其它解答方式(还需要再思考!):leetcode官方