Leetcode题解 0017期

(听说第三届CCF-GAIR会在深圳举办啊,有点想去……看情况吧,但是仍然保证不鸽)

0059题 螺旋矩阵 II【Spiral Matrix II】

题目:
给定一个正整数 n,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

题目相对严谨

无需注意太多

解题思路:
这题就是上次螺旋矩阵的变形,而且还变简单了,如果变成m*n的话就真的直接改了,就不post代码了。


0060题 第k个排列【Permutation Sequence】

题目:
给出集合 [1,2,3,…,n],其所有元素共有 n ! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. “123”
  2. “132”
  3. “213”
  4. “231”
  5. “312”
  6. “321”

给定 n 和 k,返回第 k 个排列。

说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。

示例:

输入: n = 3, k = 3
输出: "213"

输入: n = 4, k = 9
输出: "2314"

题目相对严谨

需要注意:
1. 该题目的第k个是普通人的第k个,不是程序员的第k个,不从零开始计数,而是从1 :(

解题思路:
这题和之前第0046题几乎完全一样,貌似比那题还简单一些,参见这篇博文(https://blog.csdn.net/bright_silmarillion/article/details/80677824
感觉仍然可以用回溯或者itertools来做,结果发现itertools竟然会TLE,我怀疑这个后台有问题,我在本地上跑的时间很短啊→_→,永远不相信在线的数据。
然后回溯也发现不行了,所以这道题变成一道找规律的题目了,真的有点意思,po上代码

class Solution:
    def getPermutation(self, n, k):
        p = [1]
        for i in range(1, n+1):
            p.append(p[i-1]*i)
        digit = list("123456789")
        num = n-1
        res = ""
        while num:
            t = (k-1)//p[num]
            k = k - t*p[num]
            res += digit[t]
            digit.remove(digit[t])
            num -= 1
        res += digit[k-1]
        return res

(男人不能说自己快)


0061题 旋转链表【Rotate List】

题目:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

题目相对严谨

链表题,小心驶得万年船

解题思路:
又到了用Python实现链表题的时候了,哇啦哇啦……不能摸,代码post在这里

import copy
class Solution:
    def rotateRight(self, head, k):
        if head == None or head.next == None:
            return head
        n = 0
        p1 = head
        while p1 != None:
            p1 = p1.next
            n += 1

        if k % n == 0: return head

        k %= n
        p1 = head

        for i in range(n-k-1): p1 = p1.next
        h = p1.next
        p1.next = None
        t = h
        while t.next != None: t = t.next
        t.next = head

        return h

0062题 不同路径【Unique Paths】

题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
这里写图片描述
说明:m 和 n 的值均不超过 100。

示例:

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

输入: m = 7, n = 3
输出: 28

题目相对严谨

除Robust以外无需注意太多

解题思路:
这个应该是和杨辉三角并列的,最为简单的数学规律动态规划之一的题目了,其实说是DP,不如说是一道纯数学题。

import math
class Solution:
    def uniquePaths(self, m, n):
        return math.factorial(m+n-2)//(math.factorial(m-1)*math.factorial(n-1))

然而math的代码实现竟然比直接编写阶乘函数更费时间……emmm根本不知道python是怎么想的╮(╯▽╰)╭

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80719913