日常刷题(17)

1. 螺旋矩阵

1.1. 题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

1.2. 题目解析

日常刷题(14) 里的螺旋数字矩阵思路一致。找到下一个位置,然后填数字即可。

1.3. 代码

class Solution:
    def __call__(self, matrix: List[List[int]]):
        def get_next_pos():
            try:
                di, dj = pos_list[0]
                _i, _j = i + di, j + dj
                assert _matrix[_i][_j] and _i > -1 and _j > -1
                return _i, _j
            except Exception:
                pos_list.append(pos_list.pop(0))
                return get_next_pos()

        ans = []
        _matrix = [[1 for _ in row] for row in matrix]
        pos_list = [
            (0, 1), (1, 0), (0, -1), (-1, 0),
        ]

        i, j = (0, -1)
        for _ in matrix:
            for _ in _:
                i, j = get_next_pos()
                _matrix[i][j] = 0
                ans.append(matrix[i][j])
        return ans

2. 求解连续数列

2.1. 题目描述

已知连续正整数数列{K}=K1,K2,K3…Ki的各个数相加之和为S,i=N (0<S<100000, 0<N<100000), 求此数列K。

2.2. 输入描述

输入包含两个参数,1)连续正整数数列和S,2)数列里数的个数N。

2.3. 输出描述

如果有解输出数列K,如果无解输出-1。

2.4. 用例

输入 525 6
输出 85 86 87 88 89 90
说明 无

输入 3 5
输出 -1
说明 无

2.5. 题目解析

长度为n的连续数组的和可以表示为

S = k 1 + ( k 1 + 1 ) + . . . + ( k 1 + n − 1 ) S = k_1 + (k_1 + 1) + ... + (k_1 + n - 1) S=k1+(k1+1)+...+(k1+n1)

将等式整理为:
S = n k 1 + n ( n − 1 + 0 ) 2 S = n k_1 + \frac{n(n-1+0)} {2} S=nk1+2n(n1+0)

因此可以表示 k 1 k_1 k1

k 1 = S − n ( n − 1 ) 2 n k_1 = \frac{S - \frac{n(n-1)} {2}} {n} k1=nS2n(n1)

只需要判断 k 1 k_1 k1是否为正整数即可。

2.6. 代码

class Solution:
    def __call__(self, s: int, k: int):
        k1 = (s - (k * (k - 1)) / 2) / k
        if k1 <= 0 or k1 != int(k1):
            return -1

        return list(range(int(k1), int(k1) + k))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值