今天继续学习python。数组(list)在python里面,好灵活啊。各种列表方法,切片,迭代器看得我一愣一愣的。以前c++做题都是老老实实for,现在一句话就写完了,只是不知道这些方法的复杂度是多少……要学的东西越来越多了。
- 第 02 天课程题目:
遍历操作时间复杂度O(n),手册里面的题解,直接在原地开了一个最高位补零,按位加,再用切片去掉最高位的零。那么切片的时间复杂度是多少呢?按道理来说insert操作的时间复杂度也是O(n)吗,先append再逆序可能会更优一些。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = 0
for num in digits:
n = n * 10 + num
n += 1
l = []
while n:
l.append(n%10)
n //= 10
return l[::-1]
前缀和思想。只要知道总和就能知道后缀和(total_sum - pre_sum)。时间复杂度O(n)。
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
n = len(nums)
s = sum(nums)
s_pre = 0
for i in range(n):
if s_pre == s - s_pre - nums[i]:
return i
s_pre += nums[i]
return -1
我的想法是先把nums拼接起来,拼接处正好就是旋转之后的样子,按照k把前后裁剪掉就好了。注意k可能会超过数组长度,从而重复旋转多次,对k取模即可保证只旋转一次。但是这种方法把原数组延长复制了一遍空间复杂度O(n)
题解的方法是全列表翻转,按k分两段,分别对左右再翻转,这样空间复杂度可以优化到O(1),时间复杂度都是O(n)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k %= n
nums.extend(nums)
nums[:n-k]=[]
nums[n:]=[]
- 第 03 天课程题目: