237 - 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
该解法的时间复杂度为O(1),无需遍历链表。在给出待删除链表内的非尾节点的情况下,可以直接把节点的下一个值复制给当前的待删除节点,同时把待删除节点链接到该节点的下下个节点。相当于删除的不是当前节点,而是当前节点的下个节点。这样做是因为链表内搜索下个节点比搜索上个节点容易得多。
238 - 除自身以外数组的乘积
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
n = len(nums)
L, R = [0]*n, [0]*n
for i in range(n):
if i == 0:
L[i] = 1
else:
L[i] = L[i-1] * nums[i-1]
for j in range(n-1, -1, -1):
if j == n - 1:
R[j] = 1
else:
R[j] = R[j+1] * nums[j+1]
ans = [0] * n
for k in range(n):
ans[k] = L[k] * R[k]
return ans
这道题最主要的就是一点:想到ans数组的每一项ans[i]由两部分组成,即 nums[i]左边的数的乘积 乘以 nums[i]右边的数的乘积。接着就是用两个循环构造左右两个数组,再把它们乘起来。
292 - Nim 游戏
你和你的朋友,两个人一起玩 Nim 游戏:
桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。
class Solution:
def canWinNim(self, n: int) -> bool:
return n%4 != 0
思路:每一回合都必须拿石子,所以当到谁的回合还剩下4个石子,那么谁就输了。
- [1,3]先手赢
- [4]后手赢
- [5,7]先手赢,因为你可以使到对方回合时是剩下4个石子
- [8]后手赢,此时对方可以使在你的回合时剩下4个石子
以次类推可以发现当n为4的倍数时先手总会输