LeetCode笔记:Weekly Contest 306

0. 小结

这次的比赛又一次拉了,感觉最近这段时间都好不顺啊,工作方面模型也一直效果优化不好,然后比赛题目也总是有题目做不出来,其他各种不顺心的事也零零碎碎的好多,虽然99%以上都是鸡毛蒜皮的小事,但是合在一起真的差不多就差压死骆驼的最后一根稻草了,简直让人想要迸发国粹……

这次的比赛整体上又是别人6、7分钟搞定,我却始终搞不定最后一题,不过不知道是不是我小人之心度君子之腹了,抄了最后一题的答案之后,发现好多解答都是类似的,然后给的方法名字都明显和这道题目不同,看起来就又是一个曾经出现过的经典题目然后把解法在这里copy了一下,这样的话倒是可以给自己点心理安慰,多少说明可能别人也不是现场做的……

不过,这种说法估计也就是阿Q精神治疗法了,属实还是不太可取,唉,终究还是自己太弱了啊……

1. 题目一

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

1. 解题思路

这一题没啥好说的,暴力循环解一下就行了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def largestLocal(self, grid: List[List[int]]) -> List[List[int]]:
        n = len(grid)
        res = []
        for i in range(n-2):
            line = []
            for j in range(n-2):
                elems = [grid[i+x][j+y] for x in range(3) for y in range(3)]
                line.append(max(elems))
            res.append(line)
        return res

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

2. 题目二

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

1. 解题思路

这一题思路上还是挺清晰的,把所有节点的score计算出来之后取一个最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def edgeScore(self, edges: List[int]) -> int:
        n = len(edges)
        score = [0 for _ in range(n)]
        for i, u in enumerate(edges):
            score[u] += i
        s = max(score)
        for i, t in enumerate(score):
            if s == t:
                return i

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

3. 题目三

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

1. 解题思路

这一题其实还蛮有成就感的,因为感觉自己做的方法还是蛮巧妙的,基本上就是借鉴单调序列的处理方法。

我们尽可能小地分配元素,当某一个位置为I时,那么只需要确保其比前面所有的元素都大即可,而当某一个位置为D时,我们需要保证其一直到之前第一个I位置对应的元素一直是递减的,因此,我们通过一个单调序列即可进行处理。

2. 代码实现

给出python代码实现如下:

class Solution:
    def smallestNumber(self, pattern: str) -> str:
        n = len(pattern)
        s = [1]
        res = []
        for i, ch in enumerate(pattern):
            if ch == "I":
                res += s
                s = [i+2]
            else:
                s.insert(0, i+2)
        res += s
        res = [str(x) for x in res]
        return "".join(res)

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

4. 题目四

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

1. 解题思路

这一题很惭愧地没有搞定,思路倒是还算是挺清楚的,就是分情况讨论然后累积相加即可。

首先考察位数比目标值小的情况,然后在这类情况下就是一个全排列问题,唯一特殊一点的就是第一位上不能为0。

然后要考虑一下位数相同的情况,此时又需要分两类进行考察,首先是第一位比目标数小的情况,此时后面就是一个完全的排列问题,还是比较好处理的;然后就是临界情况,即第一位与目标值相同的情况,此时我们就需要考察第二位的情况,然后此时就又一次回到了这一段开头的情况。

另外还有一个比较特殊的情况就是如果这个数存在两个位数是相同的情况下,此时跳出循环即可。

但是不幸的是具体的代码翻译我却没能完成,具体的代码设计以及边界条件没有想得很清楚,结果就是呵呵了,这里也就不再班门弄斧了,我们直接给出其他大佬们的代码实现如下:

class Solution:
    def countSpecialNumbers(self, n: int) -> int:
        nums = [int(i) for i in str(n+1)] 
        d = len(nums) 
        res = 0 
        
       
        for i in range(1,d):
            res += 9 * math.perm(9,i-1)
        
		
        for i, x in enumerate(nums):
            if i == 0:
                digit_range = range(1,x) 
            else:
                digit_range = range(x)
                
            for y in digit_range:
                if y not in nums[:i]:
                    res += math.perm(9-i,d-1-i)
            if x in nums[:i]: break
                
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值