LeetCode笔记:Weekly Contest 299

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题思路上还是比较直接的,直接按照题意检查一下对角元素和非对角元素即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def checkXMatrix(self, grid: List[List[int]]) -> bool:
        n = len(grid)
        for i in range(n):
            for j in range(n):
                if i == j:
                    if grid[i][j] == 0:
                        return False
                elif i + j == n-1:
                    if grid[i][j] == 0:
                        return False
                else:
                    if grid[i][j] != 0:
                        return False
        return True

提交代码评测得到:耗时644ms,占用内存15.1MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题我的思路就是一个简单的动态规划。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countHousePlacements(self, n: int) -> int:
        MOD = 10**9 + 7
        
        @lru_cache(None)
        def dp(idx, pre):
            if idx >= n:
                return 1
            res = 0
            for i in range(4):
                if i & pre == 0:
                    res += dp(idx+1, i)
            return res % MOD
        
        return dp(0, 0)

提交代码评测得到:耗时2850ms,占用内存473.8MB。

3. 算法优化

看了一下其他人提交的结果,发现有一个更加优雅的解法。

显然两岸的排布方式是独立的,因此,我们只需要考察一侧的可能排布方式,然后平方一下就是我们最终需要的答案。

而关于如何计算一侧的可能排布方式,其事实上恰好就是一个斐波那契数列,因此,其答案也是简单的。

摘录对应的python代码实现如下:

mod = 10**9 + 7

@lru_cache(10**5 + 1)
def fib(n):
    if n <= 0:
        return 1
    return (fib(n - 1) + fib(n - 2)) % mod

class Solution:
    def countHousePlacements(self, n: int) -> int:    
        return fib(n)**2 % mod

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题的思路来说分两个阶段,第一阶段就是计算一个累积数组,分别即为 s 1 s_1 s1 s 2 s_2 s2

由此一来,我们要计算的最终答案可以表示为如下两个结果之一:

{ m a x i , j ( s 1 ( n ) + ( s 2 ( j ) − s 2 ( i ) ) − ( s 1 ( j ) − s 1 ( i ) ) ) m a x i , j ( s 2 ( n ) + ( s 1 ( j ) − s 1 ( i ) ) − ( s 2 ( j ) − s 2 ( i ) ) ) \left\{ \begin{aligned} max_{i, j}(s_1(n) + (s_2(j) - s_2(i)) -(s_1(j) - s_1(i))) \\ max_{i, j}(s_2(n) + (s_1(j) - s_1(i)) -(s_2(j) - s_2(i))) \end{aligned} \right. {maxi,j(s1(n)+(s2(j)s2(i))(s1(j)s1(i)))maxi,j(s2(n)+(s1(j)s1(i))(s2(j)s2(i)))

改写上两式即有:

{ m a x i , j ( s 1 ( n ) + ( s 2 ( j ) − s 1 ( j ) ) − ( s 2 ( i ) − s 1 ( i ) ) ) m a x i , j ( s 2 ( n ) + ( s 1 ( j ) − s 1 ( j ) ) − ( s 1 ( i ) − s 2 ( i ) ) ) \left\{ \begin{aligned} max_{i, j}(s_1(n) + (s_2(j) - s_1(j)) -(s_2(i) - s_1(i))) \\ max_{i, j}(s_2(n) + (s_1(j) - s_1(j)) -(s_1(i) - s_2(i))) \end{aligned} \right. {maxi,j(s1(n)+(s2(j)s1(j))(s2(i)s1(i)))maxi,j(s2(n)+(s1(j)s1(j))(s1(i)s2(i)))

因此,我们只需要维护 s 1 − s 2 s_1 - s_2 s1s2以及 s 2 − s 1 s_2 - s_1 s2s1的两个单调数组即可完成答案的求解。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumsSplicedArray(self, nums1: List[int], nums2: List[int]) -> int:
        n = len(nums1)
        s1, s2 = [0] + list(accumulate(nums1)), [0] + list(accumulate(nums2))
        res = max(s1[-1], s2[-1])
        
        delta = [x-y for x, y in zip(s1, s2)]
        s = []
        for x in delta:
            while s != [] and x <= s[-1]:
                s.pop()
            s.append(x)
            res = max(res, s2[-1] + s[-1] - s[0])
        
        delta = [x-y for x, y in zip(s2, s1)]
        s = []
        for x in delta:
            while s != [] and x <= s[-1]:
                s.pop()
            s.append(x)
            res = max(res, s1[-1] + s[-1] - s[0])
        return res

提交代码评测得到:耗时1914ms,占用内存40.2MB。

4. 题目四

给出题目四的试题链接如下:

这一题我放弃了,实在是没有啥很好的思路,唉……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值