一枚菜鸟的leetcode刷题笔记 - Day16

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的倍数时先手总会输

你可能感兴趣的:(leetcode,leetcode,链表,数据结构,python)